MySQL - 在一个查询中按两列计数[重复]
Posted
技术标签:
【中文标题】MySQL - 在一个查询中按两列计数[重复]【英文标题】:MySQL - Count by two columns in one query [duplicate] 【发布时间】:2018-04-10 19:01:00 【问题描述】:这是我的桌子:
| ID | TYPE |
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 0 |
| 5 | 0 |
现在,我想计算 TYPE=1 存在多少条记录,以及 TYPE=0 存在多少条记录。有可能吗?
我知道,我可以通过两个查询来完成:
SELECT COUNT(*) AS all_zero FROM `table WHERE type = 0;
SELECT COUNT(*) AS all_one FROM `table WHERE type = 1;
但我想在一个查询中完成。 有可能吗?
【问题讨论】:
【参考方案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 特定的简写,其他数据库可能不会接受。
如果我们忽略对NULL值的处理,这基本上等价于
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
;
要获得与此答案中的第一个查询相同的 NULL 值处理和相同的结果,我们可以这样写:
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
;
在所有这些中,主题保持不变:我们正在汇总条件的结果。又名条件聚合。
【讨论】:
【参考方案2】:GROUP BY
正是这样做的:
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)
如果您希望在单个结果集行中获得不同的计数,请参阅the answer by spencer7593
。
【讨论】:
【参考方案3】:很简单:
SELECT
`type`,
count(*) as `typecount`
FROM table
GROUP BY `type`
【讨论】:
以上是关于MySQL - 在一个查询中按两列计数[重复]的主要内容,如果未能解决你的问题,请参考以下文章