Subquery con più risultati combinati in un unico campo?
-
27-09-2019 - |
Domanda
Si supponga che ho questi tavoli, da cui ho bisogno di risultati di ricerca di visualizzazione in un browser:
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
Ho bisogno di output che assomiglia a questo:
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 parte importante è che ogni tipo di elemento ottiene solo record / riga nel ritorno sullo schermo. Ho compiuto questo in passato restituendo più righe dello stesso elemento e utilizzando un linguaggio di scripting per limitare l'output. Tuttavia, ciò rende l'interfaccia utente eccessivamente complicato e loopy. Quindi, spero che posso ottenere il database di sputare solo come molti record in quanto vi sono righe da visualizzare.
Questo esempio può essere un po 'estrema causa del 2 join necessaria per raggiungere il contenitore dalla voce (tramite la tabella di vendita).
sarei felice solo per un esempio di query che emette questo:
itemid itemname saleids saledates
1 Barbie Doll 1,2 20100101,20100102
2 Coin 3,4 20091201,20091115
3 Pop-Top 4 20091115
I può restituire solo un singolo risultato in una subquery, quindi non sono sicuro di come fare questo.
Soluzione
Supponendo che si sta utilizzando MySQL (delle quattro domande che avete, solo uno è contrassegnati come MySQL), il funzione group_concat è quello che stai dopo:
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
Se si desidera che gli elementi che potrebbero non avere collegamenti alle vendite e / o contenitori tavoli -. Add "LEFT" di fronte al "JOIN"