Перейти к основному содержимому
Версия: 2.0.x

group_concat

Объединяет ненулевые значения из группы в одну строку с аргументом sep, который по умолчанию равен ,, если не указан. Эта функция может использоваться для объединения значений из нескольких строк столбца в одну строку.

group_concat поддерживает DISTINCT и ORDER BY в версиях 3.0 новее 3.0.6 и версиях 3.1 новее 3.1.3.

Синтаксис

VARCHAR GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR sep])

Параметры

  • expr: значения для объединения, нулевые значения игнорируются. Должен иметь тип VARCHAR. Вы можете опционально указать DISTINCT для удаления дублирующихся значений из выходной строки. Если вы хотите объединить несколько expr напрямую, используйте concat или concat_ws для указания форматов.
  • Элементы в ORDER BY могут быть беззнаковыми целыми числами (начиная с 1), именами столбцов или обычными выражениями. Результаты сортируются по возрастанию по умолчанию. Вы также можете явно указать ключевое слово ASC. Если вы хотите отсортировать результаты по убыванию, добавьте ключевое слово DESC к имени столбца, по которому выполняется сортировка.
  • sep: необязательный разделитель, используемый для объединения ненулевых значений из разных строк. Если он не указан, по умолчанию используется , (запятая). Чтобы удалить разделитель, укажите пустую строку ''.

ПРИМЕЧАНИЕ

Начиная с v1.5.2, произошло изменение поведения при указании разделителя. Вы должны использовать SEPARATOR для объявления разделителя, например, select group_concat(name SEPARATOR '-') as res from ss;.

Возвращаемое значение

Возвращает строковое значение для каждой группы и возвращает NULL, если нет ненулевых значений.

Вы можете ограничить длину строки, возвращаемой group_concat, установив переменную сессии group_concat_max_len, которая по умолчанию равна 1024. Минимальное значение: 4. Единица измерения: символы.

Пример:

SET [GLOBAL | SESSION] group_concat_max_len = <value>;

Примеры

  1. Создайте таблицу ss, которая содержит оценки по предметам.

    CREATE TABLE `ss` (
    `id` int(11) NULL COMMENT "",
    `name` varchar(255) NULL COMMENT "",
    `subject` varchar(255) NULL COMMENT "",
    `score` int(11) NULL COMMENT ""
    ) ENGINE=OLAP
    DUPLICATE KEY(`id`)
    DISTRIBUTED BY HASH(`id`) BUCKETS 4
    PROPERTIES (
    "replication_num" = "1"
    );

    insert into ss values (1,"Tom","English",90);
    insert into ss values (1,"Tom","Math",80);
    insert into ss values (2,"Tom","English",NULL);
    insert into ss values (2,"Tom",NULL,NULL);
    insert into ss values (3,"May",NULL,NULL);
    insert into ss values (3,"Ti","English",98);
    insert into ss values (4,NULL,NULL,NULL);
    insert into ss values (NULL,"Ti","Phy",98);

    select * from ss order by id;
    +------+------+---------+-------+
    | id | name | subject | score |
    +------+------+---------+-------+
    | NULL | Ti | Phy | 98 |
    | 1 | Tom | English | 90 |
    | 1 | Tom | Math | 80 |
    | 2 | Tom | English | NULL |
    | 2 | Tom | NULL | NULL |
    | 3 | May | NULL | NULL |
    | 3 | Ti | English | 98 |
    | 4 | NULL | NULL | NULL |
    +------+------+---------+-------+
  2. Используйте group_concat.

Пример 1: Объедините имена в строку с разделителем по умолчанию, игнорируя нулевые значения. Дублирующиеся имена сохраняются.

 select group_concat(name) as res from ss;
+---------------------------+
| res |
+---------------------------+
| Tom,Tom,Ti,Tom,Tom,May,Ti |
+---------------------------+

Пример 2: Объедините имена в строку, соединённые разделителем -, игнорируя нулевые значения. Дублирующиеся имена сохраняются.

 select group_concat(name SEPARATOR '-') as res from ss;
+---------------------------+
| res |
+---------------------------+
| Ti-May-Ti-Tom-Tom-Tom-Tom |
+---------------------------+

Пример 3: Объедините уникальные имена в строку с разделителем по умолчанию, игнорируя нулевые значения. Дублирующиеся имена удаляются.

 select group_concat(distinct name) as res from ss;
+---------------------------+
| res |
+---------------------------+
| Ti,May,Tom |
+---------------------------+

Пример 4: Объедините строки имя-предмет одного и того же ID в порядке возрастания score. Например, TomMath и TomEnglish имеют общий ID 1, и они объединяются запятой в порядке возрастания score.

 select id, group_concat(distinct name,subject order by score) as res from ss group by id order by id;
+------+--------------------+
| id | res |
+------+--------------------+
| NULL | TiPhy |
| 1 | TomMath,TomEnglish |
| 2 | TomEnglish |
| 3 | TiEnglish |
| 4 | NULL |
+------+--------------------+

Пример 5: group_concat вложен с concat(), который используется для объединения name, - и subject в строку. Строки в одной и той же строке сортируются в порядке возрастания score.

 select id, group_concat(distinct concat(name, '-',subject) order by score) as res from ss group by id order by id;
+------+----------------------+
| id | res |
+------+----------------------+
| NULL | Ti-Phy |
| 1 | Tom-Math,Tom-English |
| 2 | Tom-English |
| 3 | Ti-English |
| 4 | NULL |
+------+----------------------+

Пример 6: Совпадающий результат не найден, и возвращается NULL.

select group_concat(distinct name) as res from ss where id < 0;
+------+
| res |
+------+
| NULL |
+------+

Пример 7: Ограничьте длину возвращаемой строки шестью символами.

 set group_concat_max_len = 6;

select id, group_concat(distinct name,subject order by score) as res from ss group by id order by id;
+------+--------+
| id | res |
+------+--------+
| NULL | TiPhy |
| 1 | TomMat |
| 2 | NULL |
| 3 | TiEngl |
| 4 | NULL |
+------+--------+

Ключевое слово

GROUP_CONCAT,CONCAT,ARRAY_AGG