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


GROUP_CONCAT DISTINCT (MySQL)

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

Данные

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

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

Таблица news

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

Записи

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

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

Записи

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 комментарий к новости.

1
2
3
4
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 Четвертейшая новость Алексей,Артем,Вася
Опубликовано: 01 декабря 2013  ·  Автор: Артём Фёдоров  ·  3548 просмотров

Категория

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

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

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

Комментарии

MySQL, СУБД

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

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

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

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

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