53

例を挙げて、何をする必要があるかを説明します。まず、 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

しかし、 nameのすべての値を収集してこのような結果を得ることは可能ですか?

id | name
===+=================
1  | foo, bar, foobar
2  | foo, bar, foobar
4

4 に答える 4

61

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

SQL フィドルのデモ

于 2013-09-20T06:26:44.227 に答える
22

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;

アップデート

SQL Server 2017 では、STRING_AGG()関数を使用するだけでそれを実現できます。

SELECT ID, STRING_AGG (name, ', ') AS Name
FROM Table1
GROUP BY ID

このSQLFiddleを参照してください

于 2013-09-20T06:39:43.617 に答える
20

Postgres 用string_agg()

select id, 
       string_agg(name, ',' order by name) as name_list
from the_table
group by id
order by id;
于 2013-09-20T06:34:54.110 に答える