在網站開發的過程中,經常會用到數據統計功能,因此條件計數查詢便是不可避免的,下面介紹幾種方法來解決此問題。
例(假設):
mysql> select * from count_demo;
+-------+------+-----+
| class | pass | sex |
+-------+------+-----+
| 2 | 1 | 男 |
| 2 | 0 | 女 |
| 1 | 1 | 男 |
| 3 | 1 | 女 |
| 5 | 1 | 男 |
| 4 | 0 | 女 |
| 1 | 0 | 女 |
| 2 | 1 | 男 |
| 6 | 0 | 男 |
+-------+------+-----+
9 rows in set
現有統計一個年級某項考試通過記錄表如上(class代表班級,pass表示考試是否通過,1為通過,0為未通過,sex為性別)。
現在需要進行統計,每一個班級通過考試以及沒有通過考試的人數。
方法一:使用OR NULL
mysql> select count(pass=1 or null) as pass,count(pass=0 or null) as no_pass,class from count_demo group by class; +------+---------+-------+ | pass | no_pass | class | +------+---------+-------+ | 1 | 1 | 1 | | 2 | 1 | 2 | | 1 | 0 | 3 | | 0 | 1 | 4 | | 1 | 0 | 5 | | 0 | 1 | 6 | +------+---------+-------+ 6 rows in set
其中需要注意的是“or null”的使用,手冊中提到 COUNT(column_name) 函數返回指定列的值的數目(NULL 不計入),那么如果pass不等於1的時候,or null就起作用,讓條件為null,那么count就不會計算pass不為1的值。也即是正確的統計結果。(可自行去掉or null測試一下,得到的結果是錯誤的)
方法二:使用多條select
mysql> select count(pass) as pass,class from count_demo where pass=1 group by class; +------+-------+ | pass | class | +------+-------+ | 1 | 1 | | 2 | 2 | | 1 | 3 | | 1 | 5 | +------+-------+ 4 rows in set
mysql> select count(pass) as pass,class from count_demo where pass=0 group by class; +------+-------+ | pass | class | +------+-------+ | 1 | 1 | | 1 | 2 | | 1 | 4 | | 1 | 6 | +------+-------+ 4 rows in set
這樣很直觀也很簡單,如果統計條件少,建議使用。
方法三:使用CASE WHEN
mysql> select count(case when pass=1 then 1 else null end)as pass,count(case when pass=0 then 1 else null end)as no_pass,class from count_demo group by class; +------+---------+-------+ | pass | no_pass | class | +------+---------+-------+ | 1 | 1 | 1 | | 2 | 1 | 2 | | 1 | 0 | 3 | | 0 | 1 | 4 | | 1 | 0 | 5 | | 0 | 1 | 6 | +------+---------+-------+ 6 rows in set
CASE WHEN語句的功能很強大,可以定義靈活的查詢條件,很適合進行分類統計。