Перейти к основному содержимому

group_concat

Описание

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

ПРИМЕЧАНИЕ

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

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

Возвращает строковое значение для каждой группы и возвращает NULL, если нет не-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: Объедините имена в строку с разделителем по умолчанию и с игнорированием null значений. Дублирующиеся имена сохраняются.

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

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

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

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

 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 |
+------+--------+

keyword

GROUP_CONCAT,CONCAT,ARRAY_AGG