3

如何计算表中的行数以及特定条件为真的行数,而无需像这样使用子选择:

create table t (a integer);
insert into t (a) values (1), (2), (null);

select
    (select count(*) from t) as total_lines,
    (select count(*) from t where a = 1) as condition_true
;
 total_lines | condition_true 
-------------+----------------
           3 |              1
4

3 回答 3

6
select count(*) as total_lines, count(a = 1 or null) as condition_true
from t
;
 total_lines | condition_true 
-------------+----------------
           3 |              1

它之所以有效,是因为:

首先,虽然count(*)计算所有行而不考虑任何内容,count(my_column)但仅计算 my_column 不为空的那些行:

select count(a) as total
from t
;
 total 
-------
     2

第二个(false or null)返回null,所以只要我的条件不满足,它就会返回null并且不会被计算在内count(condition or null),它只计算不为空值。

于 2012-06-30T11:37:12.217 回答
3

使用SUM(condition)

select
    count(*) as total_lines,
    sum(a = 1) as condition_true
from t

看到它在这里工作。

这是有效的,因为在 mysql 中,trueis1falseis 0,所以当条件为真和为假时,sum()条件将添加- 这有效地计算了条件为真的次数。10

许多人错误地认为你需要一个case声明,但你不需要 mysql(你需要一些其他数据库)

于 2012-06-30T12:38:12.987 回答
2

这可以使用计数内的条件轻松完成。我不知道它是否是优化的方法,但它可以完成工作

你可以这样做

select count(*) as total_lines, COUNT(CASE WHEN a = 1 THEN 1 END) as condition_true from t

你可以在这里查看

sqlFiddle

于 2012-06-30T12:47:15.900 回答