GROUP_CONCAT DISTINCT (MySQL)

GROUP_CONCAT группирует данные столбца в строку. Чтобы попадали только уникальные записи необходимо использовать команду DISTINCT.

Данные

Например есть две таблицы: news и comment.

Необходимо сгруппировать уникальных пользователей при помощи GROUP_CONCAT DISTINCT.

Таблица news

CREATE TABLE `news` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `text` TEXT NOT NULL, `add_date` DATE NOT NULL, PRIMARY KEY (`id`) ) COLLATE='utf8_general_ci' ENGINE=InnoDB;

Записи

INSERT INTO `news` (`id`, `text`, `add_date`) VALUES (1, 'The very first news', '2013-11-10'), (2, 'Просто вторая новость', '2013-11-13'), (3, 'Очень третья новость', '2013-11-16'), (4, 'Четвертейшая новость', '2013-11-19');

Таблица comment

CREATE TABLE `comment` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `news_id` INT(10) UNSIGNED NOT NULL, `user` VARCHAR(20) NOT NULL DEFAULT '', `text` VARCHAR(1024) NULL DEFAULT NULL, `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), INDEX `FK_comments2news` (`news_id`), CONSTRAINT `FK_comment2news` FOREIGN KEY (`news_id`) REFERENCES `news` (`id`) ON UPDATE CASCADE ON DELETE CASCADE ) COLLATE='utf8_general_ci' ENGINE=InnoDB;

Записи

INSERT INTO `comment` (`id`, `news_id`, `user`, `text`, `time`) VALUES (1, 1, 'Вася', 'Отличная новость!', '2013-11-15 23:00:35'), (2, 2, 'Артем', 'Пиши еще', '2013-11-16 23:00:47'), (3, 3, 'Леша', '+1', '2013-11-17 23:01:01'), (4, 4, 'Вася', 'Первый!', '2013-11-18 23:01:59'), (5, 2, 'Вася', 'Точно! Пиши!', '2013-11-19 23:02:12'), (6, 1, 'Артем', 'Согласен! Плюсую', '2013-11-16 23:02:29'), (7, 1, 'Вася', 'Лалала', '2013-11-17 23:02:57'), (8, 1, 'Артем', 'Кул!', '2013-11-18 23:03:12'), (9, 2, 'Сергей', 'Круто!', '2013-11-20 23:03:33'), (10, 3, 'Вася', 'Тоже плюсую', '2013-11-18 23:03:50'), (11, 3, 'Артем', 'Рад этой новости', '2013-11-19 23:04:13'), (12, 4, 'Вася', '+100500', '2013-11-25 23:11:35'), (13, 4, 'Артем', '+101501', '2013-11-26 23:11:48'), (14, 4, 'Алексей', '+102502', '2013-11-27 23:12:15');

Пример GROUP_CONCAT DISTINCT

Например нужно получить список новостей и сгруппированных пользователей, которые оставили хотя бы 1 комментарий к новости.

SELECT n.`id`, n.`text`, GROUP_CONCAT(DISTINCT c.`user` ORDER BY c.`user` ASC) FROM `news` n INNER JOIN `comment` c ON c.`news_id` = n.`id` GROUP BY n.`id`

Результат

В результате выполнения запроса вернутся новости и пользователи сгруппированные в строку users. Пользователи будут отсортированы по алфавиту и не будут повторяться.

id text users
1 The very first news Артем,Вася
2 Просто вторая новость Артем,Вася,Сергей
3 Очень третья новость Артем,Вася,Леша
4 Четвертейшая новость Алексей,Артем,Вася

Категории

СУБДMySQL

Читайте также

Комментарии