{MySQL} Aide sur requête inverse de concat

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. 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
    1. 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
      1. 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
        1. 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. 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
        2. 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
          1. 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
            1. 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