GROUP BYを使用してMySQLで文字列を連結する方法は?


351

基本的に問題はこれからどうやって得るかです:

foo_id foo_name
1 A
1 B
2 C

これに:

foo_id foo_name
1 AB
2 C

13
DOWNVOTE列文字列に名前を付けるのは非常に混乱し、データ型のような名前を付けます。したがって、列名を指定しているときに回答がデータ型を指定しているように見えるため、回答もその影響を受けます
barlop

2
@barlopは、質問と回答を編集して修正しました。
ustun

回答:



164
SELECT id, GROUP_CONCAT( string SEPARATOR ' ') FROM table GROUP BY id

詳細はこちら

上記のリンクからGROUP_CONCAT:この関数は、グループからの非NULL値を連結した文字列結果を返します。NULL以外の値がない場合は、NULLを返します。


結果の列には文字数の制限があります。こちらとドキュメントをご覧ください:)
marlo

18
SELECT id, GROUP_CONCAT(CAST(name as CHAR)) FROM table GROUP BY id

カンマ区切りの文字列を提供します


17
SELECT id, GROUP_CONCAT(name SEPARATOR ' ') FROM table GROUP BY id;

:-MySQLでは、式の組み合わせの連結値を取得できます。重複する値を削除するには、DISTINCT句を使用します。結果の値をソートするには、ORDER BY句を使用します。逆順に並べ替えるには、ORDER BY句で並べ替えの基準となる列の名前にDESC(降順)キーワードを追加します。デフォルトは昇順です。これは、ASCキーワードを使用して明示的に指定できます。グループ内の値間のデフォルトの区切り文字はカンマ(“、”)です。セパレータを明示的に指定するには、SEPARATORの後にグループ値の間に挿入する必要がある文字列リテラル値を続けます。セパレータを完全に削除するには、SEPARATOR ''を指定します。

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

または

mysql> SELECT student_name,
    ->     GROUP_CONCAT(DISTINCT test_score
    ->               ORDER BY test_score DESC SEPARATOR ' ')
    ->     FROM student
    ->     GROUP BY student_name;

15

結果はgroup_concat_max_lenシステム変数で指定された最大長に切り捨てられます。これはデフォルト値が1024文字なので、最初に次のようにします。

SET group_concat_max_len=100000000;

そして、例えば:

SELECT pub_id,GROUP_CONCAT(cate_id SEPARATOR ' ') FROM book_mast GROUP BY pub_id

結果は、group_concat_max_lenシステム変数で指定された最大長に切り捨てられます。これは、デフォルト値1024文字です。docs
marlo

この構成のスコープは何group_concat_max_lenですか?現在の接続/セッション、または他のクライアントに影響しますか?
Frozen Flame

@FrozenFlame:>修飾子が存在しない場合、SETはセッション変数を変更します。変数にセッション値がない場合、エラーが発生します。dev.mysql.com/doc/refman/5.7/en/using-system-variables.html
arminrosu

3
これはOPの質問には答えませんが、役立つ情報を追加するだけです。これは回答ではなく、コメントである必要があります。
Sean the Bean

1
このコードスニペットをお寄せいただきありがとうございます。このコードスニペットは、限られた範囲内ですぐに役立つ場合があります。適切な説明が大幅にこれは問題に良い解決策であり、他、同様の質問を将来の読者にそれがより便利になるだろう、なぜ示すことによって、その長期的な価値を向上させるであろう。答えを編集して、仮定を含めて説明を追加してください。
ドナルドダック

11

素晴らしい答え。私はNULLSにも問題があり、GROUP_CONCAT内にCOALESCEを含めることによってそれを解決することができました。次の例:

SELECT id, GROUP_CONCAT(COALESCE(name,'') SEPARATOR ' ') 
FROM table 
GROUP BY id;

これが他の誰かを助けることを願っています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.