Функция GROUP_CONCAT
Функция GROUP_CONCAT складывает (как
строки) содержимое одного поля из разных
строк, вставляя между ними разделитель (по
умолчанию это запятая). К примеру, можно
получить список всех выбранных имен через
запятую или другой разделитель.
У этой функции есть ограничение на объем
выводимых данных. По умолчанию 1024
символа для каждого объединения - для каждой
выводимой строки. Если размер склеенных данных
больше, то он будет урезаться. Чтобы расширить
размер нужно выполнить команду SET group_concat_max_len
= 4096; Если у вас есть привилегии, то вы
расширите объем получаемых данных до 4096,
можно и больше. Но чаще всего на обычных
хостингах таких привилегий нет.
Синтаксис
Без указания разделителя (по умолчанию это будет запятая):
SELECT GROUP_CONCAT(field) FROM table_name WHERE condition
С указанием разделителя:
SELECT GROUP_CONCAT(field SEPARATOR separator) FROM table_name WHERE condition
Таблицы для примеров
| 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
Результат выполнения SQL запроса:
| name |
|---|
| user1,user2,user3,user4,user5,user6 |
Пример
Давайте изменим разделитель на '+'
с помощью команды SEPARATOR:
SELECT GROUP_CONCAT(name SEPARATOR '+') AS name FROM employees
Результат выполнения SQL запроса:
| name |
|---|
| user1+user2+user3+user4+user5+user6 |
Пример
Давайте с помощью команды WHERE
выберем не все строки, а только заданные:
SELECT GROUP_CONCAT(name) AS name
FROM employees
WHERE id >= 3 AND id <= 5
Результат выполнения SQL запроса:
| name |
|---|
| user3,user4,user5 |
Пример
Давайте с помощью команды GROUP BY сгруппируем строки по возрасту и для каждой группы выведем через запятую имена работников с таким возрастом:
SELECT age, GROUP_CONCAT(name) AS name
FROM employees
GROUP BY age
Результат выполнения SQL запроса:
| age | name |
|---|---|
| 23 | user1,user3 |
| 25 | user2 |
| 27 | user5 |
| 28 | user6 |
| 30 | user4 |
Пример
Давайте поменяем разделитель на '-':
SELECT age, GROUP_CONCAT(name SEPARATOR '-') AS name
FROM employees
GROUP BY age
Результат выполнения SQL запроса:
| age | name |
|---|---|
| 23 | user1-user3 |
| 25 | user2 |
| 27 | user5 |
| 28 | user6 |
| 30 | user4 |