GROUP_CONCAT
2022/03/12 18:25:41Noranekoです。
ちょっと集計システムを改修してて、
全体からあるグループで集計してその集計の中の更に細かい部分を見たい。
この場合一対多と言う構造になるので、クエリを2回もしくは
サブクエリや結合等複雑なクエリになってしまう。
例えばこんな風に
人数 | 都道府県 | 市区町村 |
---|---|---|
1 | 千葉県 | 柏市 |
5 | 埼玉県 | 草加市 深谷市 三郷市 |
4 | 東京都 | 杉並区 八王子市 |
会員を『都道府県』別の人数と『市区町村』を同時に知りたい場合、
SELECT
COUNT(pref) '人数',
pref '都道府県',
GROUP_CONCAT(city) '市区町村'
WHERE member
GROUP BY pref;
COUNT(pref) '人数',
pref '都道府県',
GROUP_CONCAT(city) '市区町村'
WHERE member
GROUP BY pref;
こんな簡潔なクエリで取れてしまいます。
ちょっと感動。
ただこのままだと、
人数 | 都道府県 | 市区町村 |
---|---|---|
1 | 千葉県 | 柏市 |
5 | 埼玉県 | 草加市,三郷市,深谷市,深谷市,草加市 |
4 | 東京都 | 八王子市,八王子市,杉並区,八王子市 |
というちょっと残念な結果になってしまいます。
しかしこれを最初の表の結果にしたい場合、
SELECT
COUNT(pref) '人数',
pref '都道府県',
GROUP_CONCAT(DISTINCT(city ORDER BY city)) '市区町村'
WHERE member
GROUP BY pref;
COUNT(pref) '人数',
pref '都道府県',
GROUP_CONCAT(DISTINCT(city ORDER BY city)) '市区町村'
WHERE member
GROUP BY pref;
とこれも簡単かつ簡潔なクエリで取れます。
結果は
人数 | 都道府県 | 市区町村 |
---|---|---|
1 | 千葉県 | 柏市 |
5 | 埼玉県 | 草加市,深谷市,三郷市 |
4 | 東京都 | 杉並区,八王子市 |
わかりやすくしかも時間もかからない。
久しぶりに便利関数に遭遇しました。
つうかMySQL4.1からあるのか…
先入観で一対多だからサブクエリだなとSQLを組んでました。
注意点としては、GROUP_CONCATの最大長が決まってるので、
戻り値が全て欲しい場合は、GROUP_CONCAT_MAX_LENを設定する必要があります。
またデリミタも第二引数で設定することで、自由に変更可能です。
使う場面は結構あると思うので、是非使ってみましょう!
気に入ったら押してね
~こんなアプリ出してます~