2009-05-20 167 views
8

我想统计表中的记录总数和匹配特定条件的总记录数。我可以做两个单独的查询这些:两个SQL COUNT()查询?

SELECT COUNT(*) AS TotalCount FROM MyTable; 
SELECT COUNT(*) AS QualifiedCount FROM MyTable 
    {possible JOIN(s) as well e.g. JOIN MyOtherTable mot ON MyTable.id=mot.id} 
    WHERE {conditions}; 

有没有办法将这些组合成一个查询,以便我在一行中获得两个字段?

SELECT {something} AS TotalCount, 
    {something else} AS QualifiedCount 
    FROM MyTable {possible JOIN(s)} WHERE {some conditions} 

如果没有,我可以发出两个查询和包裹他们在一个交易所以它们是一致的,但我希望有一个做到这一点。

编辑:我最关心的是原子性;如果有两个子SELECT语句需要,那么只要有一个INSERT来自某个地方,它就不会使这两个响应不一致。

编辑2:CASE的答案很有帮助,但在我的具体实例中,条件可能包括与另一个表的联接(忘了在我原来的帖子中提到,抱歉),所以我猜这种方法不行。

+0

您使用的是哪种数据库? – Andomar 2009-05-20 15:48:07

+0

MySQL,但我想知道它一般如果它非常简单 – 2009-05-20 15:54:37

+0

相关但不是解决方案:你也可以用来获得更大的表的计数。 SELECT SQL_CALC_FOUND_ROWSFROM MyTable; SELECT FOUND_ROWS(); SELECT SQL_CALC_FOUND_ROWSFROM MyTable WHERE {conditions}; SELECT FOUND_ROWS(); – 2009-05-20 16:03:23

回答

22

一种方法是加入表对本身:

select 
    count(*) as TotalCount, 
    count(s.id) as QualifiedCount 
from 
    MyTable a 
left join 
    MyTable s on s.id = a.id and {some conditions} 

另一种方法是使用子查询:

select 
    (select count(*) from Mytable) as TotalCount, 
    (select count(*) from Mytable where {some conditions}) as QualifiedCount 

或者你可以把条件的情况下:

select 
    count(*) as TotalCount, 
    sum(case when {some conditions} then 1 else 0 end) as QualifiedCount 
from 
    MyTable 

相关:

SQL Combining several SELECT results

19

在SQL Server或MySQL,你可以做一个CASE语句:

select 
    count(*) as TotalCount, 
    sum(case when {conditions} then 1 else 0 end) as QualifiedCount 
from MyTable 

编辑:

select 
    count(*) as TotalCount, 
    sum(case when {conditions} then 1 else 0 end) as QualifiedCount 
from MyTable t 
left join MyChair c on c.TableId = t.Id 
group by t.id, t.[othercolums] 

的GROUP BY:如果您使用的条件JOIN这也适用是否确保您只能从主表中找到一行。

+1

只是想指出,这个例子会比任何联合或联合表现要好得多,因为它只需评估有问题的表格 – kscott 2009-05-20 15:55:42

7

如果你只是计算行,你可以使用嵌套查询。

select 
    (SELECT COUNT(*) AS TotalCount FROM MyTable) as a, 
    (SELECT COUNT(*) AS QualifiedCount FROM MyTable WHERE {conditions}) as b 
0

MySQL不计空值,所以这应该工作太:

SELECT count(*) AS TotalCount, 
    count(if(field = value, field, null)) AS QualifiedCount 
    FROM MyTable {possible JOIN(s)} WHERE {some conditions} 

,如果QuailifiedCount字段来自一个LEFT JOIN,你只当它存在在乎效果很好。要获得用户数量和已填写地址的用户数量:

SELECT count(user.id) as NumUsers, count(address.id) as NumAddresses 
    FROM Users 
    LEFT JOIN Address on User.address_id = Address.id;