2010-06-16 10 views
0

Supposons que je ces tableaux, dont j'ai besoin d'afficher les résultats de recherche dans un navigateur:Sous-requête avec plusieurs résultats combinés dans un seul champ?

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 

L'important est que chaque type d'élément obtient seulement un enregistrement/rangée dans le retour sur l'écran. J'ai accompli ceci dans le passé en renvoyant plusieurs lignes du même article et en utilisant un langage de script pour limiter la sortie. Cependant, cela rend l'interface utilisateur trop compliquée et fastidieuse. J'espère donc que la base de données ne crachera autant d'enregistrements que de lignes à afficher.

Cet exemple peut être un peu extrême en raison des 2 jointures nécessaires pour accéder au conteneur à partir de l'article (via la table des ventes).

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.

+3

Quels SGBDR utilisez-vous? –

Répondre

2

En supposant que vous utilisez MySQL (des quatre questions que vous avez, un seul est étiqueté comme MySQL), le GROUP_CONCAT function 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 liens vers les tables SALES et/ou CONTENEURS - ajouter "GAUCHE" devant le "JOIN".

+0

cela fonctionne parfaitement sauf que le groupe par devrait juste être i.name (pour éviter les lignes dupliquées du même nom d'article). Merci pour cette excellente réponse. – Todd

+0

Thar y aller, monsieur (ou madame). – Todd

+0

@Todd: Vous voulez dire "Stallion" ou "Mare" - certainement pas hongre :) http://wiki.answers.com/Q/Other_gender_for_horse –

Questions connexes