A voir également:
- {MySQL} Aide sur requête inverse de concat
- Annuaire inversé - Guide
- Ecran inversé - Guide
- Slash inversé ✓ - Forum MacOS
- Comment taper le anti slash? ✓ - Forum Programmation
- Annuaire inversé suisse ✓ - Forum Mobile
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 !!
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 !!
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 !!
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 !!
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 ?
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 ?
Salut
tu peux peut-être utiliser
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
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
Mille excuses
À 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
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...
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...
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
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)
à 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 1177et :
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)
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 !!
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 !!