GROUP_CONCAT
Синтаксис
GROUP_CONCAT(expr)
Описание
Эта функция возвращает строковый результат с конкатенированными не-NULL значениями из группы. Возвращает NULL, если нет не-NULL значений.
Максимальная длина возвращаемой строки в байтах определяется системной переменной сервера group_concat_max_len, которая по умолчанию составляет 1 МБ (>= MariaDB 10.2.4) или 1 КБ (<= MariaDB 10.2.3).
Если group_concat_max_len <= 512, тип возвращаемого значения — VARBINARY или VARCHAR; в противном случае — BLOB или TEXT. Выбор между бинарным и небинарным типом зависит от входных данных.
Полный синтаксис следующий:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val]
[LIMIT {[offset,] row_count | row_count OFFSET offset}])
DISTINCT исключает дублирующие значения из выходной строки.
ORDER BY определяет порядок возвращаемых значений.
SEPARATOR указывает разделитель между значениями. По умолчанию разделителем является запятая (,). Возможно избежать использования разделителя, указав пустую строку.
LIMIT
До MariaDB 10.3.2 было невозможно использовать предложение LIMIT с GROUP_CONCAT. Это ограничение было снято в MariaDB 10.3.3.
Примеры
SELECT student_name,
GROUP_CONCAT(test_score)
FROM student
GROUP BY student_name;
Получение удобочитаемого списка пользователей MariaDB из таблицы mysql.user:
SELECT GROUP_CONCAT(DISTINCT User ORDER BY User SEPARATOR '\n') FROM mysql.user;
В предыдущем примере используется DISTINCT, поскольку один и тот же пользователь может встречаться более одного раза. Новый символ строки (\n) используется в качестве SEPARATOR, что делает результаты более удобочитаемыми.
Получение удобочитаемого списка хостов, с которых каждый пользователь может подключаться:
SELECT User, GROUP_CONCAT(Host ORDER BY Host SEPARATOR ', ') FROM mysql.user GROUP BY User ORDER BY User;
В предыдущем примере показана разница между ORDER BY для GROUP_CONCAT (который сортирует конкатенированные хосты) и ORDER BY для SELECT (который сортирует строки).
Начиная с MariaDB 10.3.3, LIMIT может быть использован с GROUP_CONCAT, поэтому, например, для следующей таблицы:
CREATE TABLE d (dd DATE, cc INT);
INSERT INTO d VALUES ('2017-01-01',1);
INSERT INTO d VALUES ('2017-01-02',2);
INSERT INTO d VALUES ('2017-01-04',3);
следующий запрос:
SELECT SUBSTRING_INDEX(GROUP_CONCAT(CONCAT_WS(":",dd,cc) ORDER BY cc DESC),",",1) FROM d;
+----------------------------------------------------------------------------+
| SUBSTRING_INDEX(GROUP_CONCAT(CONCAT_WS(":",dd,cc) ORDER BY cc DESC),",",1) |
+----------------------------------------------------------------------------+
| 2017-01-04:3 |
+----------------------------------------------------------------------------+
может быть проще переписан как:
SELECT GROUP_CONCAT(CONCAT_WS(":",dd,cc) ORDER BY cc DESC LIMIT 1) FROM d;
+-------------------------------------------------------------+
| GROUP_CONCAT(CONCAT_WS(":",dd,cc) ORDER BY cc DESC LIMIT 1) |
+-------------------------------------------------------------+
| 2017-01-04:3 |
+-------------------------------------------------------------+
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/group_concat/