【SQL】 GROUP_CONCATとは?

sql group_concat SQL

GROUP_CONCATは、MySQLで「同じグループのデータを1行にまとめる」ための便利な関数です。

GROUP_CONCATの基本構文と使い方

GROUP_CONCATの基本構文

SELECT GROUP_CONCAT(列名) FROM テーブル名 GROUP BY 列名;

使い方

次のような「item_list」テーブルを用意します。

iduser_iditem_name
11ノート
21ノート
31ペン
42定規
52消しゴム

このテーブルからuser_idごとに購入した商品を1行にまとめたいとき、GROUP_CONCATを使うとこうなります。

SELECT user_id, GROUP_CONCAT(item_name) AS items
FROM item_list
GROUP BY user_id;

結果:

user_iditems
1ノート,ノート,ペン
2定規,消しゴム

これで、誰が何を購入したのかを簡単にまとめることができます。

よく使うオプションとその使い方

DISTINCT(重複を除く)

GROUP_CONCATでデータをまとめる時に重複しないように抽出したい場合は、DISTINCTを使います。

SELECT user_id, GROUP_CONCAT(DISTINCT item_name) AS items
FROM item_list
GROUP BY user_id;

結果:

user_iditems
1ノート,ペン
2定規,消しゴム

同じ商品名が何度も出てくる場合に、1回だけ表示してくれます。

SEPARATOR(区切り文字の変更)

デフォルトではカンマ区切りで出力されますが、他の文字で区切ることもできます。

SELECT user_id, GROUP_CONCAT(item_name SEPARATOR '/') AS items
FROM item_list
GROUP BY user_id;

結果:

user_iditems
1ノート/ノート/ペン
2定規/消しゴム

これでカンマの代わりに’/’で区切ることができます。

ORDER BY(並び順の指定)

まとめた値を指定の順番に並び替えたい時はORDER BYを使います。

SELECT user_id, GROUP_CONCAT(ORDER BY item_name ASC) AS items
FROM item_list
GROUP BY user_id;

結果:

user_iditems
1ノート,ノート,ペン
2消しゴム,定規

アルファベット順・五十音順など、指定の順番に並べることができます。


注意点

NULLの扱い

GROUP_CONCATはNULLを自動的に無視します。

テーブルにNULLがある場合、抽出結果にNULLは表示されません。

まとめ

GROUP_CONCATを使えば、バラバラだった行を1つにまとめることができます。
基本の構文に加えて、DISTINCTやORDER BY、区切り文字などのオプションを使えば、さらに幅が広がります。ぜひ試してみてください。

タイトルとURLをコピーしました