読者です 読者をやめる 読者になる 読者になる

アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

複雑な条件でGROUP BYする

下記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句での指定で漏れないようにするとか、
きちんと考えて書かないとヘンな不具合の原因になりそうです。


それ以前にこんなクエリ書かなきゃいけないテーブル設計がクソ