# Функция GROUP_CONCAT

Функция `GROUP_CONCAT` складывает (как строки) содержимое одного поля из разных строк, вставляя между ними разделитель (по умолчанию это запятая). К примеру, можно получить список всех выбранных имен через запятую или другой разделитель.

У этой функции есть ограничение на объем выводимых данных. По умолчанию `1024` символа для каждого объединения - для каждой выводимой строки. Если размер склеенных данных больше, то он будет урезаться. Чтобы расширить размер нужно выполнить команду SET group_concat_max_len = 4096; Если у вас есть привилегии, то вы расширите объем получаемых данных до `4096`, можно и больше. Но чаще всего на обычных хостингах таких привилегий нет.

## Синтаксис

Без указания разделителя (по умолчанию это будет запятая):

`SELECT GROUP_CONCAT(поле) FROM имя_таблицы WHERE условие`

С указанием разделителя:

`SELECT GROUP_CONCAT(поле SEPARATOR разделитель) FROM имя_таблицы WHERE условие`

## Таблицы для примеров

таблица employees
id айди | name имя | age возраст | salary зарплата
--- | --- | --- | ---
1 | user1 | 23 | 400
2 | user2 | 25 | 500
3 | user3 | 23 | 500
4 | user4 | 30 | 900
5 | user5 | 27 | 500
6 | user6 | 28 | 900

## Пример

В данном примере запрос находит все имена из таблицы и выводит их через запятую:

`SELECT GROUP_CONCAT(name) as name FROM employees`

Результат выполнения кода:

name имена
user1,user2,user3,user4,user5,user6

## Пример

В данном примере разделитель меняется на `'+'` с помощью команды `SEPARATOR`:

`SELECT GROUP_CONCAT(name SEPARATOR '+') as name FROM employees`

Результат выполнения кода:

name имена
user1+user2+user3+user4+user5+user6

## Пример

В данном примере с помощью команды `WHERE` выбираются не все строки, а заданные:

`SELECT GROUP_CONCAT(name) as name FROM employees WHERE id>=3 AND id<=5`

Результат выполнения кода:

name имена
user3,user4,user5

## Пример

В данном примере с помощью команды GROUP BY строки группируются по возрасту и для каждой группы через запятую выводятся имена работников с таким возрастом:

`SELECT age, GROUP_CONCAT(name) as name FROM employees GROUP BY age`

Результат выполнения кода:

age возраст | name имена
--- | ---
23 | user1,user2,user3
24 | user4,user5
25 | user6

## Пример

Поменяем разделитель на `'-'`:

`SELECT age, GROUP_CONCAT(name SEPARATOR '-') as name FROM employees GROUP BY age`

Результат выполнения кода:

age возраст | name имена
--- | ---
23 | user1-user2-user3
24 | user4-user5
25 | user6

## Смотрите также

- функцию `CONCAT`,
  которая складывает строки
- функцию `CONCAT_WS`,
  которая складывает строки с разделителем

←→
↑