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>;
Примеры
-
Создайте таблицу
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 |
+------+------+---------+-------+ -
Используйте 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