Объединение строк с GROUP BY и CONCAT в MySQL
Быстрый ответ
Для группировки строк в MySQL используйте функцию GROUP_CONCAT().
Пример запроса:
SELECT employee_department, GROUP_CONCAT(employee_name SEPARATOR ', ')
FROM employees
GROUP BY employee_department;
Таким образом мы группируем для каждого отдела сотрудников, объединяя их имена в одну строку, что делает обработку данных более эффективной.

Подробное рассмотрение GROUP_CONCAT
Обзор GROUP_CONCAT
Функция GROUP_CONCAT() в MySQL — это эффективный инструмент для объединения строк из различных записей по общим значениям ключевых полей. Её применение можно сравнить со сборкой списка покупок, упорядоченного по категориям.
Управление разделителями при помощи GROUP_CONCAT
Опция SEPARATOR в GROUP_CONCAT() позволяет определить разделитель между объединяемыми строками. Это может быть запятая ,, пробел или даже перевод строки \n. Если разделитель не указан, MySQL по умолчанию использует запятую.
Пример:
SELECT id, GROUP_CONCAT(name SEPARATOR ' ')
FROM table
GROUP BY id;
Обработка значений NULL
GROUP_CONCAT() вернёт NULL, если все строки в группе имеют значение NULL. Если же среди строк сущетсвуют NULL значения, они будут пропущены и не войдут в итоговую строку.
Синтаксис GROUP_CONCAT
Понимание синтаксиса GROUP_CONCAT() важно для формулирования более сложных запросов:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
Преодоление ограничений на длину строки в GROUP_CONCAT
Если результат, полученный с помощью GROUP_CONCAT(), сокращён до 1024 символов, то вы можете увеличить значение системной переменной group_concat_max_len.
Визуализация
Давайте сравним применение GROUP BY в MySQL со сборкой пазла:
| До использования GROUP BY | После применения GROUP BY и GROUP_CONCAT |
| ------------------------------------ | ---------------------------------------- |
| 🧩 Элемент: "Джон" | Собранная картинка: "Джон, Алиса" |
| 🧩 Элемент: "Алиса" |
Собираем отдельные элементы в одно целое, используя GROUP BY и GROUP_CONCAT:
SELECT group_field, GROUP_CONCAT(string_field SEPARATOR ', ')
FROM your_table
GROUP BY group_field;
Так, мы формируем упорядоченную последовательность данных.
Продвинутое применение GROUP_CONCAT
Применение DISTINCT в функции GROUP_CONCAT
Ключевое слово DISTINCT позволяет выбрать только уникальные значения, исключая дубликаты.
SELECT employee_department, GROUP_CONCAT(DISTINCT employee_name SEPARATOR ', ')
FROM employees
GROUP BY employee_department;
Использование ORDER BY внутри функции GROUP_CONCAT
Сортируйте элементы функции GROUP_CONCAT() используя ORDER BY:
SELECT employee_department,
GROUP_CONCAT(employee_name ORDER BY employee_name SEPARATOR ', ')
FROM employees
GROUP BY employee_department;
Совместное использование JOIN и GROUP_CONCAT
Применяйте GROUP_CONCAT() вместе с JOIN для формирования сложных запросов, включающих данные из нескольких таблиц:
SELECT dept.name, GROUP_CONCAT(emp.name ORDER BY emp.name SEPARATOR ', ')
FROM departments dept
LEFT JOIN employees emp ON emp.department_id = dept.id
GROUP BY dept.name;
Полезные материалы
- MySQL :: MySQL 8.0 Reference Manual :: 12.19.1 Aggregate Function Descriptions — официальная документация по функции
GROUP_CONCAT. - MySQL GROUP_CONCAT power — детальное рассмотрение возможностей функции
GROUP_CONCAT. - MySQL group_concat() function overview — комплексный обзор функции
GROUP_CONCATи её практическое применение. - Avoid GROUP_CONCAT truncation — способы обхода ограничения на длину строки в функции
GROUP_CONCAT.