複数のレコード数をカウントするSQL

投稿者: | 2019/06/11

複数のレコード数を1つのSQLでカウントする場合、結論から

SELECT 
  COUNT(field1='xxx' or null) AS count1, 
  COUNT(field2='yyy' or null) AS count2 
FROM users ;

みたいな感じ。

具体的にはCOUNT()はnull以外レコード数を取ってくるのが仕様らしいです。
ポイントは何も入っていなかったり, FALSEの場合もカウントには入るという点です。
ひたすらnullだけ除外します。

or nullというのが少し気持ち悪いですが以下のSQLを流してみると分かります。

SELECT true and null, true or null, false and null, false or null;
=> null, true, false, null

見やすくすると

true  and null => null
true  or  null => true
false and null => false
false or  null => null

つまり条件としては2行目と4行目の条件に当てはまる可能性があり、COUNT()ではnullが除外され条件に合致するのものをカウントできる、ということです。
逆に条件に合わないものの数を数える場合はorをandにしてやれば良い、ということですね。
割と直感的ではないので構文として覚えておくと良さそうですね。


コメントを残す

メールアドレスが公開されることはありません。