2010-10-14 12 views
32

Mam trzy tabele:Jak połączyć ciągi z podzapytania w jeden wiersz w 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) 

Co staram się zrobić, to zwrócić wszystkie informacje w tabeli pakietu PLUS listę stref dla tego pakietu. Chcę, żeby lista stref była posortowana alfabetycznie i rozdzielona przecinkami.

więc wyjście szukam jest coś takiego ...

+------------+---------------+--------+----------------+ 
| 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 | 
+------------+---------------+--------+----------------+ 

Wiem, że mógłbym coś zrobić w PHP z warstwy prezentacji, aby uzyskać pożądany efekt. Problem polega na tym, że chciałbym posortować zone_list ASC lub DESC, a nawet użyć "WHERE zone_list LIKE" i tak dalej. Aby to zrobić, potrzebuję tego zrobić w MYSQL.

Nie mam pojęcia, jak zacząć to rozwiązywać. Próbowałem użyć podzapytania, ale wciąż narzekałem na wiele wierszy. Próbowałem połączyć wiele wierszy w jeden ciąg znaków, ale widocznie MySQL tego nie lubi.

Z góry dziękuję.

AKTUALIZACJA!

Oto rozwiązanie dla osób zainteresowanych.

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

użyj grupy wg z group_concat w polu strefy –

Odpowiedz

51

za pomocą funkcji GROUP_CONCAT() i połączenia GROUP BY. Oto przykład zapytania

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 

powinna nadal być w stanie zamówić przez id_strefy s (lub zone_list), a zamiast używać LIKE można użyć WHERE zp.zone_id = 'Z1' lub coś podobnego.

+0

Tak blisko. Prawie na miejscu! Chciałbym posortować listę strefową alfabetycznie. Właśnie dlatego zastanawiałem się trochę nad podzapytaniem. Bardzo blisko. – mrbinky3000

+1

Wyobrażam sobie, że mogę umieścić "ZAMÓWIENIE" w GROUP CONCAT. więc GROUP_CONCAT (pz.zone_id ORDER BY pz.zone_id ASC SEPARATOR ',') pracował !!!! – mrbinky3000

+0

Rewizja: nie działa. Zawsze zwraca wszystkie możliwe strefy dla każdego rzędu. Każdy wiersz powinien zwracać tylko strefy dla tego konkretnego pakietu. – mrbinky3000

Powiązane problemy