Avec plusieurs sous-requête les résultats combinés en un seul champ?
-
27-09-2019 - |
Question
Supposons que j'ai ces tableaux, dont j'ai besoin de résultats de recherche d'affichage dans un navigateur:
Table: Containers
id | name
1 Big Box
2 Grocery Bag
3 Envelope
4 Zip Lock
Table: Sale
id | date | containerid
1 20100101 1
2 20100102 2
3 20091201 3
4 20091115 4
Table: Items
id | name | saleid
1 Barbie Doll 1
2 Coin 3
3 Pop-Top 4
4 Barbie Doll 2
5 Coin 4
Je besoin d'une sortie qui ressemble à ceci:
itemid itemname saleids saledates containerids containertypes
1 Barbie Doll 1,2 20100101,20100102 1,2 Big Box, Grocery Bag
2 Coin 3,4 20091201,20091115 3,4 Envelope, Zip Lock
3 Pop-Top 4 20091115 4 Zip Lock
La partie importante est que chaque type d'élément obtient seulement un enregistrement / ligne dans le retour à l'écran. J'accompli dans le passé en retournant plusieurs lignes d'un même article et en utilisant un langage de script pour limiter la sortie. Cependant, ce qui rend l'interface trop complexe et loufoque. Donc, j'espère que je peux obtenir la base de données de cracher uniquement autant de dossiers qu'il ya de lignes à afficher.
Cet exemple peut être un peu extrême à cause de la 2 Assemble nécessaire pour obtenir au conteneur de l'élément (à travers la table de vente).
Je serais heureux pour juste une exemple de requête qui affiche ceci:
itemid itemname saleids saledates
1 Barbie Doll 1,2 20100101,20100102
2 Coin 3,4 20091201,20091115
3 Pop-Top 4 20091115
Je ne peux retourner un seul résultat dans une sous-requête, donc je ne suis pas sûr de savoir comment faire.
La solution
En supposant que vous utilisez MySQL (des quatre questions que vous avez, un seul est étiqueté comme MySQL), fonction GROUP_CONCAT est ce que vous êtes après:
SELECT i.name AS itemname,
GROUP_CONCAT(s.id ORDER BY s.id) AS salesids,
GROUP_CONCAT(s.date ORDER BY s.date) AS salesdates,
GROUP_CONCAT(s.containerid ORDER BY s.containerid) AS containerids,
GROUP_CONCAT(c.name ORDER BY c.name) AS containertypes
FROM ITEMS i
JOIN SALE s ON s.id = i.salesid
JOIN CONTAINERS c ON c.id = s.containerid
GROUP BY i.name
Si vous voulez que les éléments qui pourraient ne pas avoir des liens avec les ventes et / ou CONTENEURS tables -. Ajouter « GAUCHE » devant la « JOIN »