データベース
条件付きのCOUNTクエリ
えだ
更新日:2021/08/05
プログラム構成において頑張りどころはいろいろあれど、僕はSQLで頑張るのが好きです。
条件付きでCOUNTクエリ発行出来たらいいのになって考えたこと無いですか?
もちろんサブクエリ使えば何とでもなりますが、サブクエリ無しだとどうでしょう?
例えばこんなテーブルscoreがあったとして
id | point |
---|---|
1 | 50 |
2 | 30 |
3 | 70 |
4 | 10 |
5 | 20 |
30point未満の件数と50point以上の件数を欲しい場合、普通に考えるとこんなクエリになります。
1 2 3 |
/* before */ SELECT COUNT(*) FROM score WHERE point < 30; SELECT COUNT(*) FROM score WHERE point >= 50; |
これを一度で取得したいと思いませんか? 思いますよね?
こんなカンジデイケます。
条件付きCOUNTクエリ:取得方法その1
クエリ
1 2 3 4 5 |
/* example1 */ SELECT COUNT(IF(point < 30,1,NULL)) AS count1 , COUNT(IF(point >= 50,1,NULL)) AS count2 FROM score; |
解説
ポイントはCOUNT関数の仕様です。
COUNT関数はアスタリスク(*)を使用するとグループ内の全レコード数を返し、以外を指定した場合、NULL値 をカウント数に含めない。
さらに DISTINCT を指定すると重複した値の行をカウントに含めない。
つまりCOUNTで式が利用できることに気付くのがミソです。
ちなみに、多値論理である3値論理の論理演算が苦でなければ、こちらのほうがスマートです。
条件付きCOUNTクエリ:取得方法その2
クエリ
1 2 3 4 5 |
/* example2 */ SELECT COUNT(point < 30 OR NULL) AS count1 , COUNT(point >= 50 OR NULL) AS count2 FROM score; |
解説
3値論理の論理演算で下記になることを理解出来ていると難とないことですね。
- (TRUE AND NULL) → NULL
- (FALSE AND NULL) → FALSE
- (TRUE OR NULL) → TRUE
- (FALSE OR NULL) → NULL
みなさんも頑張れることはとにかくSQLで頑張ってみませんか!