Un-à-Plusieurs SQL SELECT dans une seule ligne
J'ai des données dans deux tables.
La première table possède une Clé Primaire appelé PKID
PKID DATA
0 myData0
1 myData1
2 myData2
La deuxième table a la PKID colonne du tableau 1, en tant que clé étrangère
PKID_FROM_TABLE_1 U_DATA
0 unique0
0 unique1
0 unique2
1 unique3
1 unique4
1 unique5
2 unique6
2 unique7
2 unique8
L'instruction SELECT de base que je fais maintenant est
SELECT a.PKID, a.DATA, b.U_DATA
FROM table1 as a
INNER JOIN table2 as b
ON a.PKID = b.PKID_FROM_TABLE_1
Cela produit un tableau comme ceci:
PKID DATA U_DATA
0 myData0 unique0
0 myData0 unique1
0 myData0 unique2
1 myData1 unique3
1 myData1 unique4
1 myData1 unique5
2 myData2 unique6
2 myData2 unique7
2 myData2 unique8
Ce que je voudrais, c'est le tableau suivant:
PKID DATA U_DATA1 U_DATA2 U_DATA3
0 myData0 unique0 unidque1 unique2
1 myData1 unique3 unidque4 unique5
2 myData2 unique6 unidque7 unique8
Si ça aide, chaque PKID a exactement 3 entrées dans la table2.
Est quelque chose comme cela possible dans MySQL?
Voir stackoverflow.com/questions/7674786/mysql-pivot-table
double possible de Jointure de deux tables (1-M) où la deuxième table doit être "aplati" dans une ligne
double possible de Jointure de deux tables (1-M) où la deuxième table doit être "aplati" dans une ligne
OriginalL'auteur Grizz | 2012-07-11
Vous devez vous connecter pour publier un commentaire.
C'est une manière d'obtenir le résultat.
Cette approche utilise des sous-requêtes corrélées. Chaque sous-requête utilise une
ORDER BY
clause de trier les lignes connexes de table2, et utilise leLIMIT
clause de récupérer le le 1er, 2e et 3e lignes.SUIVI
@gliese581g souligne qu'il peut y avoir des problèmes de performances avec cette approche, avec un grand nombre de lignes retournées par la requête externe, puisque chaque sous-requête dans la liste de sélection est exécuté pour chaque ligne retournée dans la requête externe.
Il devrait aller sans dire que cette approche réclame un indice:
-ou, au minimum
Il est probable que le dernier indice existe déjà, si il y a une clé étrangère est définie. L'ancien indice permettrait à la requête pour être satisfait entièrement à partir de la page d'index ("à l'Aide de l'indice"), sans la nécessité d'une opération de tri ("Using filesort").
@glies581g est tout à fait raison de souligner que les performances de cette approche peut être problématique sur les "gros" jeux.
Est-il possible de le faire pour un nombre dynamique de U_DATA... Par exemple, ma base (de haut niveau) la pensée est quelque chose de ce genre... b(x).U_data LIMITE de x,1
Ne serait-il pas trop lent si il y a un grand nombre de documents?
si cette requête est "trop lent" dépend vraiment des besoins. Vous avez raison de souligner qu'un "grand nombre" de lignes dans le tableau 1 signifie que les sous-requêtes dans la liste de sélection sera exécuté un "grand nombre" de fois (une fois pour chaque ligne retournée à partir de table1). La requête j'ai fourni n'est pas la seule approche, et ce n'est pas forcément le plus efficace. Mais si les performances de cette requête est mesurée comme étant "trop lente", qui dépend vraiment sur les exigences de performance. trop
Oui, vous avez raison, une fois de plus 🙂
OriginalL'auteur spencer7593
En fonction de votre version de MySQL, vous pouvez regarder dans GROUP_CONCAT
SELECT a.PKID ,GROUP_CONCAT(b.U_DATA) FROM a join b on a.PKID_FROM_TABLE_1 = a.PKID GROUP BY a.PKID;
OriginalL'auteur sdfor