複雑な条件で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(`test_table`.`value`) AS `min_value` FROM `test_table` GROUP BY `test_table`.`id` < 4 ,`test_table`.`id` >= 4
GROUP句には条件式も使えるんですねー。
(ORDER句でも使えるのを知ってて思いつきましたが)
もちろん複数フィールドを使った条件式や、等号不等号に限らず、IN等も使えます。
ちなみにGROUP句部分を下記のようにした場合、
GROUP BY `test_table`.`id` = 1 ,`test_table`.`id` IN (2,3)
結果はこうなります。
-- 68 // id = 1 の中で最も小さい 15 // id IN (2,3) の中で最も小さい 19 --
と、条件から漏れたレコードについては勝手にまとめられるようです。
使い方に応じて、不要なものはWHERE句できちんと省くとか、
もしくはGROUP句での指定で漏れないようにするとか、
きちんと考えて書かないとヘンな不具合の原因になりそうです。
それ以前にこんなクエリ書かなきゃいけないテーブル設計がクソ