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
;
在所有这一切中,主题都是一样的:我们正在聚合一个条件的结果。又名条件聚合