我会在示例中解释我需要做什么.首先,我们有一个像这样的简单表,名为table:
id | name
===+=====
1 | foo
1 | bar
1 | foobar
2 | foo
2 | bar
2 | foobar
Run Code Online (Sandbox Code Playgroud)
现在查询:
SELECT t.* FROM table t GROUP BY t.id
Run Code Online (Sandbox Code Playgroud)
会得到类似于这个的结果:
id | name
===+=====
1 | foo
2 | foo
Run Code Online (Sandbox Code Playgroud)
但是有可能收集所有名称的值来得到这样的结果吗?
id | name
===+=================
1 | foo, bar, foobar
2 | foo, bar, foobar
Run Code Online (Sandbox Code Playgroud)
Adr*_*der 39
使用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])
Run Code Online (Sandbox Code Playgroud)
就像是
SELECT ID, GROUP_CONCAT(name) GroupedName
FROM Table1
GROUP BY ID
Run Code Online (Sandbox Code Playgroud)
a_h*_*ame 16
对于Postgres使用 string_agg()
select id,
string_agg(name, ',' order by name) as name_list
from the_table
group by id
order by id;
Run Code Online (Sandbox Code Playgroud)
him*_*056 16
对于SQL Server(2017年之前),使用FOR XML子句和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;
Run Code Online (Sandbox Code Playgroud)
使用SQL Server 2017,您可以简单地使用STRING_AGG()函数来实现:
SELECT ID, STRING_AGG (name, ', ') AS Name
FROM Table1
GROUP BY ID
Run Code Online (Sandbox Code Playgroud)