Вы можете авторизоваться через ВКонтакте, Фейсбук и оставить комментарий


GROUP_CONCAT (MySQL)

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

Данные

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

Таблица car

1
2
3
4
5
6
7
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;

Записи

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

Таблица car_model

1
2
3
4
5
6
7
8
9
10
11
12
13
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;

Записи

1
2
3
4
5
6
7
8
9
10
11
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

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

1
2
3
4
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.

1
2
3
4
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
Опубликовано: 29 ноября 2013  ·  Автор: Артём Фёдоров  ·  5001 просмотр

Категория

ГлавнаяСУБДMySQLGROUP_CONCAT (MySQL)

Чтобы оставить комментарий нужно авторизоваться на сайте
или войти через ВКонтакте или Фейсбук

Войти через ФейсбукВойти через Твиттер

Комментарии

MySQL, СУБД

© 2010-2017 expange.ru
При полном или частичном копировании статей сайта, ссылка на источник обязательна.

Хотите узнать больше информации, пишите на: artem@expange.ru

Полезное онлайн  ·  Новости  ·  Изображения  ·  Статьи по датам

О проекте  ·  Правила пользования  ·  Представительства

Благодарности и пожелания