{MySQL} Aide sur requête inverse de concat

LeGhe -  
 LeGhe -
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 !
Configuration: Windows XP
Firefox 3.5.7

7 réponses

  1. DM
     
    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
  2. Leghe
     
    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
  3. LeGhe
     
    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
  4. fiu
     
    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
    1. fiu
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. LeGhe
     
    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
  7. fiu
     
    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
  8. LeGhe
     
    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