MySQLのGROUP BYはみなさんよく使っていると思います。
何かしらのグループごとにSUMとかCOUNTとかでSELECTするときです。
例えば、以下のようなデータをもつuser_groupというテーブルがあったとき、
| group_id | name | age |
|---|---|---|
| A | John | 24 |
| B | Bob | 22 |
| A | Tom | 31 |
| A | Adam | 19 |
| B | Mike | 25 |
| A | Bill | 33 |
例えば、こういうクエリを書くと、
SELECT group_id, COUNT(name) AS user_count
FROM user_group
GROUP BY group_id
以下のような結果がかえってきます。
| group_id | user_count |
|---|---|
| A | 4 |
| B | 2 |
この4とか2とかの中身を知りたい!というときに役に立つのが、GROUP_CONCATです。
使い方はこんな感じ。
SELECT group_id, GROUP_CONCAT(name) AS user_list
FROM user_group
GROUP BY group_id
GROUP BYされている中身をカンマ区切りでリスト化してくれます。
| group_id | user_list |
|---|---|
| A | John, Tom, Adam, Bill |
| B | Bob, Mike |
セパレーターや、並び順も変更することが可能。
SELECT group_id, GROUP_CONCAT(name ORDER BY age DESC SEPARATOR '|') AS user_list
FROM user_group
GROUP BY group_id
指定したセパレーターでsplitして、arrayで持つとかなり便利に持ち回れます。