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
コメント


お名前*

Email Address

URL

コメント*



BLOG内検索
<< 2022/12 >>
Sun Mon Tue Wed Thu Fri Sat
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31