複雑な条件でGROUP BYする
※MySQLを前提として書いています
下記Aのテーブルについて、
「idが4未満と4以上のグループに分けて、それぞれで一番小さいvalueをSELECT」
してBの結果が欲しいとき…
(A)test_table
id | value |
1 | 68 |
2 | 15 |
3 | 32 |
4 | 19 |
5 | 73 |
6 | 59 |
(B)
15 |
19 |
苦し紛れに以下のようなクエリを書いてみたら成功しました。
SELECT MIN(`value`) AS `min_value` FROM `test_table` GROUP BY `id` < 4 ,`id` >= 4
GROUP句には条件式も使えるんですねー。
(ORDER句でも使えるのを知ってて思いついただけなので、それ実はダメだよ!みたいなの知ってる方いらっしゃいましたらこっそり教えてください…)
もちろん複数フィールドを使った条件式や、
等号不等号に限らず、IN等も使えます。
ちなみにGROUP句部分を下記のようにした場合、
GROUP BY `id` = 1 ,`id` IN (2,3)
結果はこうなります。
68 |
15 |
19 |
条件から漏れたレコードについては勝手にまとめられるようですね。
使い方に応じて、不要なものはWHERE句できちんと省くとか、もしくはGROUP句での指定で漏れないようにするとか、きちんと考えて書かないとヘンな不具合の原因になりそうです。