GROUP_CONCAT (MySQL)

GROUP_CONCAT — агрегирующая функция в MySQL, позволяет сгруппировать данные столбца в строку через разделитель. Так же можно отсортировать данные, установить тип разделителя (по-умолчанию разделитель — запятая).

Данные

Например есть таблица car — таблица автомобилей и car_model — таблица моделей.

Таблица car

CREATE TABLE `car` ( `car_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL, PRIMARY KEY (`car_id`) ) COLLATE='utf8_general_ci' ENGINE=InnoDB;

Записи

INSERT INTO `car` (`car_id`, `name`) VALUES (1, 'Toyota'), (2, 'Suzuki'), (3, 'Nissan');

Таблица car_model

CREATE TABLE `car_model` ( `car_model_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `car_id` INT(10) UNSIGNED NOT NULL, `model` VARCHAR(50) NOT NULL, PRIMARY KEY (`car_model_id`), INDEX `FK_car_model_car_id` (`car_id`), CONSTRAINT `FK_car_model_car_id` FOREIGN KEY (`car_id`) REFERENCES `car` (`car_id`) ON UPDATE CASCADE ON DELETE CASCADE ) COLLATE='utf8_general_ci' ENGINE=InnoDB;

Записи

INSERT INTO `car_model` (`car_model_id`, `car_id`, `model`) VALUES (1, 1, 'Camry'), (2, 1, 'Avensis'), (3, 1, 'Corolla'), (4, 2, 'Grand Vitara'), (5, 2, 'SX4'), (6, 2, 'Swift'), (7, 3, 'Almera'), (8, 3, 'Teana'), (9, 3, 'Lancer');

GROUP_CONCAT

Задача вывести список автомобилей и список моделей сгруппированную в строку.

SELECT c.`car_id`, c.`name`, GROUP_CONCAT(cm.`model`) AS `models` FROM `car` c INNER JOIN `car_model` cm ON cm.`car_id` = c.`car_id` GROUP BY c.`car_id`

Результат

В результате будет выведено 3 столбца, car_id, name (название машины) и сгруппированная строка models (список моделей).

car_id name models
1 Toyota Camry,Avensis,Corolla
2 Suzuki Swift,Grand Vitara,SX4
3 Nissan Almera,Teana,Lancer

GROUP_CONCAT и ORDER BY, и SEPARATOR

Как видно из результата, модели машин не отсортированы и разделены запятой. Теперь отсортируем модели по алфавиту и в качестве разделителя установим точку с запятой. Для этого на понадобятся команды ORDER BY и SEPARATOR.

SELECT c.`car_id`, c.`name`, GROUP_CONCAT(cm.`model` ORDER BY cm.`model` SEPARATOR ';') AS `models` FROM `car` c INNER JOIN `car_model` cm ON cm.`car_id` = c.`car_id` GROUP BY c.`car_id`

Результат с сортировкой и разделителем

Результат будет такой же как и предыдущий, но модели будут отсортированы в алфавитном порядке и разделены точкой с запятой.

car_id name models
1 Toyota Avensis; Camry; Corolla
2 Suzuki Grand Vitara; Swift; SX4
3 Nissan Almera; Lancer; Teana

Категории

СУБДMySQL

Комментарии