Combinez plusieurs lignes dans une ligne MySQL
Dire que j'ai deux tables dans une Base de données MySQL.
Tableau 1:
ID Name
1 Jim
2 Bob
3 John
Tableau 2:
ID key value
1 address "X Street"
1 city "NY"
1 region "NY"
1 country "USA"
1 postal_code ""
1 phone "123456789"
Lors de la sélection des lignes à partir de la base de données, est-il possible de rejoindre les lignes de la seconde table comme des colonnes sur la première table?
Le résultat souhaité à droite de la requête MySQL est:
ID Name address city region country postal_code phone
1 Jim X Street NY NY USA NULL 123456789
2 Bob NULL NULL NULL NULL NULL NULL
3 John NULL NULL NULL NULL NULL NULL
Merci pour toute aide!
source d'informationauteur n0nnus
Vous devez vous connecter pour publier un commentaire.
Ce type de transformation de données est connu comme un PIVOT. MySQL n'a pas une fonction de pivot, mais vous pouvez le reproduire à l'aide d'une fonction d'agrégation avec un
CASE
expression:Voir SQL jouer avec la Démo.
Cela pourrait aussi être écrite à l'aide de plusieurs jointures sur votre
table2
et vous devez inclure un filtre sur la jointure pour chaquekey
:Voir SQL jouer avec la Démo.
Les deux versions sera excellent travail si vous avez un nombre limité de
key
valeurs. Si vous avez un nombre inconnu de valeurs, alors vous aurez envie de regarder à l'aide d'une requête préparée pour générer le SQL dynamique:Voir SQL jouer avec la Démo
Toutes les versions donne un résultat:
Vous avez une structure appelée entité-attribut-valeur dans la seconde table. Il y a deux façons de faire la combinaison. Je pense que la méthode d'agrégation est la plus simple à exprimer:
La seconde méthode consiste à faire des jointures pour chaque valeur:
En fonction de la structure des données, la
join
méthode peut effectivement être plus rapide dans MySQL, quand il utilise une indexation appropriée. (D'autres bases de données ont été algorithmes d'agrégation, de sorte que legroup by
méthode fonctionne bien dans d'autres bases de données.)