2010-10-14 14 views
32

Ho tre tabelle:Come concatenare le stringhe da una sottoquery in una singola riga in mysql?

table "package" 
----------------------------------------------------- 
package_id  int(10)  primary key, auto-increment 
package_name varchar(255) 
price   decimal(10,2) 

table "zones" 
------------------------------------------------------ 
zone_id   varchar(32) primary key (ex of data: A1, Z2, E3, etc) 

table "package_zones" 
------------------------------------------------------ 
package_id  int(10) 
zone_id  varchar(32) 

Quello che sto cercando di fare è restituire tutte le informazioni nella tabella pacchetto PLUS un elenco di zone per quel pacchetto. Voglio che l'elenco delle zone sia ordinato alfabeticamente e separato da virgole.

Così l'uscita che sto cercando è qualcosa di simile ...

+------------+---------------+--------+----------------+ 
| package_id | package_name | price | zone_list  | 
+------------+---------------+--------+----------------+ 
| 1   | Red Package | 50.00 | Z1,Z2,Z3  | 
| 2   | Blue Package | 75.00 | A2,D4,Z1,Z2 | 
| 3   | Green Package | 100.00 | B4,D1,D2,X1,Z1 | 
+------------+---------------+--------+----------------+ 

So che potrei fare qualcosa in PHP con il livello di presentazione per ottenere il risultato desiderato. Il problema è che mi piacerebbe poter ordinare zone_list ASC o DESC o anche usare "WHERE zone_list LIKE" e così via. Per farlo, ho bisogno di farlo in MYSQL.

Non ho idea di come iniziare ad affrontare questo problema. Ho provato a utilizzare una subquery, ma continuava a lamentarsi di più righe. Ho provato a concatolare le righe multiple in una singola stringa, ma evidentemente a MySQL non piace questo.

Grazie in anticipo.

AGGIORNAMENTO!

Ecco la soluzione per coloro che sono interessati.

SELECT 
    `package`.*, 
    GROUP_CONCAT(`zones`.`zone` ORDER BY `zones`.`zone` ASC SEPARATOR ',' ) as `zone_list` 
FROM 
    `package`, 
    `package_zones` 
LEFT JOIN 
    (`zones`,`ao_package_zones`) ON (`zones`.`zone_id` = `package_zones`.`zone_id` AND `package_zones`.`package_id` = `package`.`package_id`) 
GROUP BY 
    `ao_package`.`package_id` 
+0

usa group by con group_concat sul campo di zona –

risposta

51

utilizzando la funzione GROUP_CONCAT() e GROUP BY chiamata. Ecco un esempio di query

SELECT 
    p.package_id, 
    p.package_name, 
    p.price, 
    GROUP_CONCAT(pz.zone_id SEPARATOR ',') as zone_list 
FROM 
    package p 
LEFT JOIN package_zone pz ON p.package_id = pz.package_id 
GROUP BY 
    p.package_id 

si dovrebbe comunque essere in grado di ordinare da id_area s (o zone_list), e invece di usare LIKE, è possibile utilizzare WHERE zp.zone_id = 'Z1' o qualcosa di simile.

+0

Così vicino. Quasi lì! Mi piacerebbe che l'elenco zone fosse ordinato alfabeticamente. Ecco perché stavo pensando più alla linea di una subquery. Molto vicino però. – mrbinky3000

+1

Capito che potrei inserire "ORDER BY" in GROUP CONCAT. quindi GROUP_CONCAT (pz.zone_id ORDINA DA pz.zone_id ASC SEPARATOR ',') ha funzionato !!!! – mrbinky3000

+0

Revisione: non ha funzionato. Restituisce sempre tutte le zone possibili per ogni riga. Ogni riga deve restituire solo le zone per quel pacchetto specifico. – mrbinky3000

Problemi correlati