GROUP_CONCATは、MySQLで「同じグループのデータを1行にまとめる」ための便利な関数です。
GROUP_CONCATの基本構文と使い方
GROUP_CONCATの基本構文
SELECT GROUP_CONCAT(列名) FROM テーブル名 GROUP BY 列名;
使い方
次のような「item_list」テーブルを用意します。
id | user_id | item_name |
---|---|---|
1 | 1 | ノート |
2 | 1 | ノート |
3 | 1 | ペン |
4 | 2 | 定規 |
5 | 2 | 消しゴム |
このテーブルからuser_idごとに購入した商品を1行にまとめたいとき、GROUP_CONCATを使うとこうなります。
SELECT user_id, GROUP_CONCAT(item_name) AS items
FROM item_list
GROUP BY user_id;
結果:
user_id | items |
1 | ノート,ノート,ペン |
2 | 定規,消しゴム |
これで、誰が何を購入したのかを簡単にまとめることができます。
よく使うオプションとその使い方
DISTINCT(重複を除く)
GROUP_CONCATでデータをまとめる時に重複しないように抽出したい場合は、DISTINCTを使います。
SELECT user_id, GROUP_CONCAT(DISTINCT item_name) AS items
FROM item_list
GROUP BY user_id;
結果:
user_id | items |
1 | ノート,ペン |
2 | 定規,消しゴム |
同じ商品名が何度も出てくる場合に、1回だけ表示してくれます。
SEPARATOR(区切り文字の変更)
デフォルトではカンマ区切りで出力されますが、他の文字で区切ることもできます。
SELECT user_id, GROUP_CONCAT(item_name SEPARATOR '/') AS items
FROM item_list
GROUP BY user_id;
結果:
user_id | items |
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_id | items |
1 | ノート,ノート,ペン |
2 | 消しゴム,定規 |
アルファベット順・五十音順など、指定の順番に並べることができます。
注意点
NULLの扱い
GROUP_CONCATはNULLを自動的に無視します。
テーブルにNULLがある場合、抽出結果にNULLは表示されません。
まとめ
GROUP_CONCATを使えば、バラバラだった行を1つにまとめることができます。
基本の構文に加えて、DISTINCTやORDER BY、区切り文字などのオプションを使えば、さらに幅が広がります。ぜひ試してみてください。