Как объединить строки из подзапроса в одну строку в 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)

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

Итак, результат, который я ищу, выглядит примерно так ...

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

person mrbinky3000    schedule 14.10.2010    source источник
comment
использовать group by с group_concat в поле зоны   -  person Haim Evgi    schedule 14.10.2010


Ответы (1)


с помощью 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' или что-то подобное.

person GSto    schedule 14.10.2010
comment
Так близко. Почти готово! Я бы хотел, чтобы zone_list был отсортирован по алфавиту. Вот почему я больше думал о подзапросе. Хотя очень близко. - person mrbinky3000; 14.10.2010
comment
Выяснилось, что я могу поместить ORDER BY в GROUP CONCAT. так GROUP_CONCAT (pz.zone_id ORDER BY pz.zone_id ASC SEPARATOR ',') работал !!!! - person mrbinky3000; 14.10.2010
comment
Доработка: не вышло. Он всегда возвращает все возможные зоны для каждой строки. Каждая строка должна возвращать только зоны для этого конкретного пакета. - person mrbinky3000; 14.10.2010
comment
Разобрался, как не допустить возврата всех возможных строк. Вам нужно было выполнить перекрестное соединение. Я поставлю ответ в очередь на всеобщее обозрение. - person mrbinky3000; 15.10.2010
comment
Для тех, кто хочет сделать это в SQL Server: stackoverflow.com/questions/6899/ - person Mahmood Dehghan; 17.10.2012
comment
Идеально ... необходимо добавить группу, чтобы указать, по какому столбцу я хочу сгруппировать, в противном случае по умолчанию используется столбец, в котором вы группируете! - person Andrew; 17.09.2015