2010-10-14 2 views
32

У меня есть три таблицы:Как объединить строки из подзапроса в одну строку в 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) 

То, что я пытаюсь сделать, это вернуть всю информацию в пакете таблице PLUS список зон для этого пакета. Я хочу, чтобы список зон отсортирован в алфавитном порядке и разделен запятыми.

Так что выход я ищу что-то вроде этого ...

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

Я знаю, что я мог бы сделать что-то в PHP с уровнем представления, чтобы получить желаемый результат. Проблема в том, что я хотел бы иметь возможность сортировать zone_list ASC или DESC или даже использовать «WHERE zone_list LIKE» и так далее. Для этого мне нужно это сделать в MYSQL.

У меня нет идеи, как даже начать заниматься этим. Я попытался использовать подзапрос, но он продолжал жаловаться на несколько строк. Я попытался объединить несколько строк в одну строку, но, очевидно, MySQL это не нравится.

Заранее спасибо.

ОБНОВЛЕНИЕ!

Вот решение для тех, кто заинтересован.

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

использовать группу с помощью group_concat в поле зоны –

ответ

51

с помощью функции GROUP_CONCAT() и GROUP BY вызова. вот пример запроса

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 

вы все равно должны быть в состоянии сделать заказ на zone_id с (или zone_list), и вместо того, чтобы использовать LIKE, вы можете использовать WHERE zp.zone_id = 'Z1' или что-то подобное.

+0

Так близко. Почти готово! Я бы хотел, чтобы zone_list сортировался по алфавиту. Вот почему я больше думал о строках подзапроса. Очень близко. – mrbinky3000

+1

Выяснилось, что я могу поставить «ORDER BY» в GROUP CONCAT. поэтому GROUP_CONCAT (pz.zone_id ORDER BY pz.zone_id ASC SEPARATOR ',') работал !!!! – mrbinky3000

+0

Редакция: не работает. Он всегда возвращает все возможные зоны для каждой строки. Каждая строка должна возвращать только зоны для этого конкретного пакета. – mrbinky3000

Смежные вопросы