Преобразование MySQL подзапроса в список через запятую
Быстрый ответ
При необходимости сформировать из результатов группировки выписку в виде строки в MySQL, можно воспользоваться функцией GROUP_CONCAT:
SELECT GROUP_CONCAT(column_name) FROM table_name;
Если требуется поменять разделитель или добавить фильтр, это также возможно:
SELECT GROUP_CONCAT(column_name SEPARATOR '; ') FROM table_name WHERE your_condition;
Эта операция возвращает список, значения которого отделены друг от друга точкой с запятой, при условии выполнения указанного условия. Метод прост и практичен.

Использование GROUP_CONCAT
Настройка вывода
Возможно параметризовать вывод GROUP_CONCAT, применяя различные опции:
/* Когда идентификатор продукта имеет значение не меньше, чем утренний кофе */
SELECT p.id,
       GROUP_CONCAT(s.name ORDER BY s.name ASC SEPARATOR ', ') AS site_list
FROM products p
INNER JOIN sites s ON s.product_id = p.id
GROUP BY p.id;
В результате запрос сформирует список s.name, упорядоченный и сгруппированный по параметру p.id.
Ограничения на длину и их изменение
GROUP_CONCAT ограничено легкостью символов, по умолчанию равным 1024. Чтобы расширить данный предел, следует выполнить команду:
SET SESSION group_concat_max_len = 1000000;
/* Мы устанавливаем ограничение на 1 миллион символов. Надо учитывать нагрузку на ресурсы. */
Важно по завершении работы возвращать настройки к начальному состоянию.
Охрана безопасности и защита целостности данных
Для предотвращения SQL-инъекций при работе с пользовательскими данными старайтесь всегда использовать параметризованные запросы и избегайте непосредственного добавления ввода пользователя в ваши SQL-запросы.
При работе с GROUP_CONCAT обратите внимание, что значения NULL будут исключены из результатов, поэтому всегда учитывайте это при анализе полученных данных.
Продвинутое применение
Использование GROUP_CONCAT совместно с JOIN
GROUP_CONCAT можно использовать вместе с INNER JOIN для создания списков, разделённых запятыми, из данных, взятых из нескольких таблиц:
/* Выявляем наиболее типичные характеристики продуктов */
SELECT p.name, 
       GROUP_CONCAT(s.feature SEPARATOR ', ') AS feature_list
FROM products p
JOIN features s ON p.id = s.product_id
GROUP BY p.id, p.name;
В ответ на такой запрос вы получите список характеристик features для каждого product, значения которого разделены запятыми.
Подзапросы
GROUP_CONCAT также рабоче при использовании в подзапросах для более удобной организации вывода результатов:
/* Готовы ли вы к погружению в подзапросы? Давайте... */
SELECT p.id,
       p.name,
       (SELECT GROUP_CONCAT(feature SEPARATOR ', ')
        FROM features
        WHERE product_id = p.id) AS feature_list
FROM products p;
Способ облегчает задачу, позволяя уменьшить число соединений и сделать запросы более компактными и целесообразными.
Аналоги GROUP_CONCAT в других СУБД
Функция GROUP_CONCAT специфична для MySQL, но её аналоги присутствуют в других СУБД:
- Oracle: функция LISTAGG()
- SQL Server: функция STRING_AGG()или использованиеFOR XML PATH, совместно сSTUFF()
- PostgreSQL: функция STRING_AGG()
Осваивайте специальные возможности различных диалектов SQL, чтобы добиваться одинаковых результатов.
Визуализация
Ниже представлен пример использования GROUP_CONCAT для объединения разных ингредиентов в один список:
SELECT GROUP_CONCAT(ingredient SEPARATOR ', ') AS dish FROM kitchen;
Результат выполнения запроса:
До: 
🍅🥕🌶️🧅
После: 
🍲: "Томат, Картошка, Перец, Лук"
В данной ситуации функция GROUP_CONCAT показывает себя достаточно эффективно.
Дополнительные советы
Контроль над результатом
Для получения стабильно упорядоченного списка, используйте сортировку внутри GROUP_CONCAT:
/* Организованные данные — залог порядка */
SELECT GROUP_CONCAT(column_name ORDER BY column_name) AS ordered_list FROM table_name;
Предотвращение сокращения данных
Следите за параметром group_concat_max_len и регулируйте его, исходя из предполагаемой длины результатов, чтобы предотвратить нежелательное урезание данных.
Корректная группировка
Применение GROUP BY поможет в формировании списков связанных данных, которое семантически дополняет GROUP_CONCAT.
Альтернативы
Исследуйте другие функции для конкатенации строк или сформируйте списки, разделённые запятыми, в приложении, если GROUP_CONCAT недоступна.
Полезные материалы
- MySQL :: Руководство по MySQL 8.0 :: 12.19.1 Описание агрегатных функций — официальная документация MySQL по функции GROUP_CONCAT.
- Newest 'group-concat' Questions – Stack Overflow — вопросы и обсуждения касательно GROUP_CONCATна Stack Overflow.
- Функция MySQL GROUP_CONCAT() – w3resource — практические упражнения по работе с функцией GROUP_CONCAT()в MySQL.
- MySQL | Функция Group_CONCAT() – GeeksforGeeks — статья о функции GROUP_CONCAT()на GeeksforGeeks.
- sql server – Соединение даты и времени со строкой для образования правильной даты и времени – Database Administrators Stack Exchange — примеры использования строковых функций, включая GROUP_CONCAT.