Агрегирующая функция GROUP_CONCAT работает аналогично функции CONCAT_WS, с тем отличием, что способна объединить не строки, как CONCAT/CONCAT_WS а результаты выборки из таблиц.
Приведу пример, дано 3 таблицы.
Таблица items связана с таблицей cats посредством таблицы item_cats. Условно говоря одному элементу таблицы items может соответствовать несколько элементов таблицы cats:
CREATE TABLE `items` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(8) NOT NULL DEFAULT »,
PRIMARY KEY (`id`)
);CREATE TABLE `cats` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(8) NOT NULL DEFAULT »,
PRIMARY KEY (`id`)
)CREATE TABLE `item_cats` (
`cat_id` int(10) unsigned NOT NULL DEFAULT ‘0’,
`item_id` int(10) unsigned NOT NULL DEFAULT ‘0’
)
Если вы у себя создадите такие таблички и наполните их, то ниже приведенная команда выведет человеко-понятный список соответствия таблиц items и cats:
SELECT
i.`name`,
ic.`cat_id`,
GROUP_CONCAT(DISTINCT c.`name` ORDER BY c.`name` SEPARATOR ‘,’)
FROM `items` i
LEFT JOIN `item_cats` ic ON i.`id`=ic.`item_id`
LEFT JOIN `cats` c ON c.`id` = ic.`cat_id`
GROUP BY i.`id`
ORDER BY i.`name`;
Однако следует заметить, что GROUP_CONCAT исходно имеет ограничение в 1024 символа, которое задаётся переменной group_concat_max_len. При превышении этого лимита данные будут отброшены.