GROUP_CONCAT

2022/03/12 18:25:41
お休みの日にプログラミング。


Noranekoです。



ちょっと集計システムを改修してて、


全体からあるグループで集計してその集計の中の更に細かい部分を見たい。


この場合一対多と言う構造になるので、クエリを2回もしくは


サブクエリや結合等複雑なクエリになってしまう。


例えばこんな風に

人数都道府県市区町村
1千葉県柏市
5埼玉県草加市
深谷市
三郷市
4東京都杉並区
八王子市



会員を『都道府県』別の人数と『市区町村』を同時に知りたい場合、


SELECT
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;


とこれも簡単かつ簡潔なクエリで取れます。


結果は


人数都道府県市区町村
1千葉県柏市
5埼玉県草加市,深谷市,三郷市
4東京都杉並区,八王子市



わかりやすくしかも時間もかからない。


久しぶりに便利関数に遭遇しました。


つうかMySQL4.1からあるのか…


先入観で一対多だからサブクエリだなとSQLを組んでました。


注意点としては、GROUP_CONCATの最大長が決まってるので、


戻り値が全て欲しい場合は、GROUP_CONCAT_MAX_LENを設定する必要があります。


またデリミタも第二引数で設定することで、自由に変更可能です。


使う場面は結構あると思うので、是非使ってみましょう!




気に入ったら押してね
  ブログランキング・にほんブログ村へ




~こんなアプリ出してます~

authored by Noraneko | Comment(0) | LAMP