SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【MySQL】GROUP_CONCAT()を使ってみる

以下のようなテーブルがあるとします。

Aテーブル
GROUP_CONCAT 1

Bテーブル
GROUP_CONCAT 2

以下のようなSQLを流すと、

SELECT
    A.id,
    GROUP_CONCAT(B.bname) as namae
FROM
    A, B
WHERE
    A.id = B.aid
GROUP BY
    A.id

こんな風に、まとめてくれました。

GROUP_CONCAT 3

そのほか、以下のようなこともできます。

昇順・降順に並べてくれる

GROUP_CONCAT(B.bname order by B.id)

重複する名前をまとめてくれる

GROUP_CONCAT(distinct(B.bname))

区切り文字指定もできる

GROUP_CONCAT(B.bname separator '/')

参考

・ MySQLの独自の関数なので、他のデータベースを使う場合は要検討(Oracleだとwmsys.wm_concatがあるなど)。


・ NULLを含む場合注意。

この関数は、グループからの連結された非 NULL 値を伴うストリング結果を戻します。非 NULL 値がない場合は NULL を戻します。

http://dev.mysql.com/doc/refman/5.1/ja/group-by-functions.html


・ 文字列を結合した結果、文字列が長くなりそうな場合は要注意。

group_concat_max_len システム環境変数は、許可された最大の長さに設定することができます。 ( デフォルト値は 1024 ) 。

最大の長さが設定された場合、結果はその最大の長さに切り詰められます。

GROUP_CONCAT() によって戻されるタイプは、group_concat_max_len が 512 より大きい場合意外は常に VARCHAR になります。512 を越える場合は BLOB になります。

http://dev.mysql.com/doc/refman/5.1/ja/group-by-functions.html

要するに文字数制限があり、

show variables like 'group_concat_max_len'; で確認できる。

set session group_concat_max_len=10000; などで設定できる。

関連するメモ

コメント(1)

M山 2015年4月2日 17:02

忘れたころに役立ちます!ありがとうございます。