MySQL-在一个查询中按两列计数
这是我的桌子:MySQL-在一个查询中按两列计数,mysql,count,Mysql,Count,这是我的桌子: | ID | TYPE | | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | 0 | | 5 | 0 | 现在,我想计算有多少记录的类型为1,有多少记录的类型为0。可能吗 我知道,我可以通过两个查询完成: SELECT COUNT(*) AS all_zero FROM `table WHERE type = 0; SELECT COUNT(*) AS all_one FROM `table WHERE type =
| ID | TYPE |
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 0 |
| 5 | 0 |
现在,我想计算有多少记录的类型为1,有多少记录的类型为0。可能吗
我知道,我可以通过两个查询完成:
SELECT COUNT(*) AS all_zero FROM `table WHERE type = 0;
SELECT COUNT(*) AS all_one FROM `table WHERE type = 1;
但我想在一个查询中完成它。
可能吗?非常简单:
SELECT
`type`,
count(*) as `typecount`
FROM table
GROUP BY `type`
分组依据
正是这样做的:
SELECT type, COUNT(*) AS count_of_type FROM my_table GROUP BY type
这将为您提供多行,每种类型一行:
+------+---------------+
| type | count_of_type |
+------+---------------+
| 0 | 2 |
| 1 | 3 |
+------+---------------+
如果有更多类型,但只需要0和1,则可以添加HAVING
子句:
SELECT type, COUNT(*) AS count_of_type FROM my_table GROUP BY type HAVING type IN (0,1)
如果您希望在单个结果集中获得不同的计数,请参阅。条件聚合可以做到这一点
SELECT SUM(t.type=0) AS cnt_zero
, SUM(t.type=1) AS cnt_one
, SUM(t.type IN (0,1)) AS cnt_one_and_zero
, SUM(1) AS cnt_all
FROM mytable t
;
请注意,
type=0
和type=1
的使用是MySQL特有的速记,其他数据库可能不会接受
如果我们忽略空值的处理,这基本上等同于
SELECT SUM(IF( t.type=0 ,1,0)) AS cnt_zero
, SUM(IF( t.type=1 ,1,0)) AS cnt_one
, SUM(IF( t.type IN (0,1), 1,0)) AS cnt_one_and_zero
, SUM(1) AS cnt_all
FROM mytable t
;
更符合ANSI标准的等效标准
SELECT SUM(CASE WHEN t.type=0 THEN 1 ELSE 0 END) AS cnt_zero
, SUM(CASE WHEN t.type=1 THEN 1 ELSE 0 END) AS cnt_one
, SUM(CASE WHEN t.type IN (0,1) THEN 1 ELSE 0 END) AS cnt_one_and_zero
, SUM(1) AS cnt_all
FROM mytable t
;
为了获得与此答案中的第一个查询相同的空值处理和相同的结果,我们可以这样编写:
SELECT SUM(CASE WHEN t.type=0 THEN 1 WHEN t.type IS NULL THEN NULL ELSE 0 END) AS cnt_zero
, SUM(CASE WHEN t.type=1 THEN 1 WHEN t.type IS NULL THEN NULL ELSE 0 END) AS cnt_one
, SUM(CASE WHEN t.type IN (0,1) THEN 1 WHEN t.type IS NULL THEN NULL ELSE 0 END) AS cnt_one_and_zero
, SUM(1) AS cnt_all
FROM mytable t
;
在所有这一切中,主题都是一样的:我们正在聚合一个条件的结果。又名条件聚合