{MySQL} Aide sur requête inverse de concat

Fermé
LeGhe - 17 févr. 2010 à 16:57
 LeGhe - 20 févr. 2010 à 11:28
Bonjour,

Quelle requête dois-je utiliser pour l'opération suivante ?

Table actuelle :
BookID auteurs
3107 1159
3134 1172,1173
3135 1163,1175
3136 1176,1177

Table désirée :
BookID auteur1 auteur2
3107 1159 NULL
3134 1172 1173
3135 1163 1175
3136 1176 1177

Merci de votre aide !
A voir également:

7 réponses

SELECT BookId, LEFT(auteurs, (INSTR(auteurs, ',')-1)) AS auteur1, LEFT(auteurs, (INSTR(auteurs, ',')-1)) AS auteur2
FROM maTable;

INSTR('val1' 'val2') renvoi le nombre de caractère a partir duquel commence val2 dans le mot val1
LEFT('val', nb ) renvoi le mot de gauche a partir du caractère situé à nb idem pour right mais dans l'autre sens !

J'ai pas testé alors dit moi si sa fonctionne !!
0
Merci pour ta réponse, la requête est valide mais ne donne pas le résultat escompté :

Table de base :
BookID auteurs
3107 1159
3109 1160
3110 1161
3111 1162
3112 1163
3113 1164
3114 1165
3115 1166
3116 1167
3117 1168
3118 1169
3119 1170
3134 1172,1173
3135 1163,1175
3136 1176,1177

Résultat après ta requête :

BookId auteur1 auteur2
3107
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3134 1172 1172
3135 1163 1163
3136 1176 1176

Mais je reconnais qu'il y a de l'idée...

Une idée ?

Merci !!
0
En fait, en modifiant un peu :

SELECT BookId, LEFT(auteurs, (INSTR(auteurs, ',')-1)) AS auteur1, RIGHT(auteurs, (INSTR(auteurs, ',')-1)) AS auteur2
FROM maTable;

Quand il y a 2 auteurs, il les sépare bien, mais quand il n'y en a qu'un, il le zappe, tout court...

Comment rajouter une condition ?
0
Salut

tu peux peut-être utiliser
SELECT case instr(auteurs, ',')
  WHEN 0 then auteurs
  ELSE left(auteurs, instr(auteurs, ',') - 1)
  END as auteur1,
SELECT case instr(auteurs, ',')
  WHEN 0 then NULL
  ELSE substr(auteurs, instr(auteurs, ',') + 1)
  END as auteur2
FROM taTable
0
Et voilà, comme d'hab !
À ne toujours pas avoir de MySQL sous la main, je teste pas ce que j'écris :-(

le deuxième SELECT ne peut pas faire partie des expressions demandées dans le select.

ça donne
SELECT case instr(auteurs, ',')
  WHEN 0 then auteurs
  ELSE left(auteurs, instr(auteurs, ',') - 1)
  END as auteur1,
case instr(auteurs, ',')
  WHEN 0 then NULL
  ELSE substr(auteurs, instr(auteurs, ',') + 1)
  END as auteur2
FROM taTable


Mille excuses
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Yes, ça a l'air de fonctionner !!
Mais je suis un newbie en SQL, comment créer une nouvelle table ?
J'ai essayé ça :

CREATE table bookauteurs2
SELECT bookauteurs.bookID case instr(auteurs, ',')
WHEN 0 then auteurs
ELSE left(auteurs, instr(auteurs, ',') - 1)
END as auteur1,
case instr(auteurs, ',')
WHEN 0 then NULL
ELSE substr(auteurs, instr(auteurs, ',') + 1)
END as auteur2
FROM bookauteurs

Mais, évidemment, ça me met pas le bookID devant les auteur1 et auteur2...
Désolé pour ma bêtise...
0
re
à créer une nouvelle table pour les auteurs, autant le faire proprement : il vaut mieux avoir une ligne pour un auteur par livre plutôt que simplement séparer les auteurs... comment feras-tu pour les livres avec trois auteurs ? et ceux à 4 ? et ceux à 7 ?
mieux vaut créer une table "ÉcritPar" avec simplement le bookid et 1 auteurid
ainsi ta table de démo apparaitrait
BookID auteurid
3107   1159
3134   1172
3134   1173
3135   1163
3135   1175
3136   1176
3136   1177
et :
SELECT bookID from ÉcritPar where auteurid=1172 te renvoie la liste des livres écrits par 1172
SELECT count(1) from ÉcritPar where auteurid=1175 te renvoie le nombre de livres écrits par 1175 (seul ou en collab)
SELECT auteurID from ÉcritPar where BookID=3105 te renvoie la liste des auteurs du livre 3105
et pour enregistrer les 5 auteurs du livre 16321 (à savoir 1172, 1177, 1859, 2145 & 2218) il suffira de
INSERT into ÉcritPar values(16321, 1172)
INSERT into ÉcritPar values(16321, 1177)
INSERT into ÉcritPar values(16321, 1859)
INSERT into ÉcritPar values(16321, 2145)
INSERT into ÉcritPar values(16321, 2218)
0
Bonjour et merci pour ta réponse.

Cependant, je n'ai pas de livres écrits par plus de 2 auteurs.
Et j'ai besoin de créer une table avec l'ID du bouquin, plus plein d'autres informations sur la même ligne, afin de faire un export CSV pour intégration sur un site.
Je "bricole" en SQL mais ce n'est vraiment pas évident pour moi, étant libraire avant tout !!

Aussi, comment, en utilisant ta requête, en écrire le résultat dans une table, avec bookID + auteur1 + auteur2 ?

SELECT case instr(auteurs, ',')
WHEN 0 then auteurs
ELSE left(auteurs, instr(auteurs, ',') - 1)
END as auteur1,
case instr(auteurs, ',')
WHEN 0 then NULL
ELSE substr(auteurs, instr(auteurs, ',') + 1)
END as auteur2
FROM taTable

Merci pour ta patience et ton aide !!
0