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で持つとかなり便利に持ち回れます。