Перейти к основному содержимому
Версия: 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: опциональный разделитель, используемый для объединения ненулевых значений из разных строк. Если не указан, по умолчанию используется , (запятая). Чтобы убрать разделитель, укажите пустую строку ''.

ПРИМЕЧАНИЕ

Начиная с версий 3.0.6 и 3.1.3 изменилось поведение при указании разделителя. Вы должны использовать 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