GROUP BY, но получить все значения из другого столбца
Я объясню, что мне нужно сделать, например. Прежде всего, у нас есть простая таблица, подобная этой, с именем table:
id | name
===+=====
1 | foo
1 | bar
1 | foobar
2 | foo
2 | bar
2 | foobar
Теперь запрос:
SELECT t.* FROM table t GROUP BY t.id
Приведем результат, похожий на этот:
id | name
===+=====
1 | foo
2 | foo
Но возможно ли, чтобы все значения имени имели такой результат?
id | name
===+=================
1 | foo, bar, foobar
2 | foo, bar, foobar
Ответы
Ответ 1
С помощью MySQL вы можете использовать GROUP_CONCAT (expr)
Эта функция возвращает результат строки с конкатенированным не-NULL значения из группы. Он возвращает NULL, если нет значений, отличных от NULL. Полный синтаксис выглядит следующим образом:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
Что-то вроде
SELECT ID, GROUP_CONCAT(name) GroupedName
FROM Table1
GROUP BY ID
Ответ 2
Для Postgres используйте string_agg()
select id,
string_agg(name, ',' order by name) as name_list
from the_table
group by id
order by id;
Ответ 3
Для SQL Server используйте STUFF()
:
SELECT distinct id, name =
STUFF((SELECT ' , ' + name
FROM Table1 b
WHERE b.id = a.id
FOR XML PATH('')), 1, 2, '')
FROM Table1 a
GROUP BY id;