MySQL查询在同一数据字段上返回2个计数

时间:2014-02-03 06:48:31

标签: mysql

我希望显示相同数据的2个计数,一个没有条件和条件,对于此列表中的大多数人来说可能是一件非常简单的事情:

当我运行这个时,我得到了所有机器的总数:

SELECT COUNT(ComputerID) AS 'Grand Total'
FROM computers

当我运行这个时,我得到了OnLine机器的总数:

SELECT COUNT(ComputerID) AS 'OnLine Total'
FROM computers
WHERE LastContact > DATE_ADD(NOW(),INTERVAL -6 MINUTE)

如何将2对1的查询结合起来以显示如下内容:

Grand Total          OnLine Total
2,500                2,145

谢谢!

3 个答案:

答案 0 :(得分:2)

SELECT COUNT(*) AS 'Grand Total',
       SUM(LastContact > DATE_ADD(NOW(), INTERVAL -6 MINUTE)) AS 'Online Total'
FROM computers

答案 1 :(得分:1)

尝试从两个单独的子查询中进行选择,因为您不必按任何方式进行分组。 E.g:

    SELECT 
    (
        SELECT COUNT(ComputerID)
        FROM computers
    )  AS GrandTotal,
    (
        SELECT COUNT(ComputerID)
        FROM computers
        WHERE LastContact > DATE_ADD(NOW(),INTERVAL -6 MINUTE)
    ) AS OnlineTotal

哦,还有一小段建议!如果您同时提供表模式也很有用。在这种情况下,您的查询非常简单,因此我不需要更多信息。但是如果将来你需要更复杂的查询帮助,可以考虑将模式输出到像SQLFiddle这样的东西:

http://sqlfiddle.com/

答案 2 :(得分:1)

关于Barmar的解决方案,看起来在'Grand Total'之后和SUM()之前只有一个缺少的逗号。如果你运行它应该工作:

    SELECT COUNT(*) AS 'Grand Total',
        SUM(LastContact > DATE_ADD(NOW(), INTERVAL -6 MINUTE)) AS 'Online Total'
    FROM computers

请记住,评估为true的表达式返回值1,false返回0.您正在求和的是该表达式为真的字段的每个实例(2,145个trues。)

这是另一个实现CASE WHEN的解决方案 - 这与上面的逻辑基本相同,但你可以让它在每个条件下返回你想要的任何东西。这可能有助于澄清Barmar的代码是如何工作的 - 它只是以不同的方式说同样的事情。如果以后想要以不同的方式计算某些值(例如,将某些计算机计为2或3或任何其他方式),此方法将非常有用:

    SELECT COUNT(ComputerID) AS  'GrandTotal', 
        SUM(CASE WHEN LastContact > DATE_ADD(NOW(),INTERVAL -6 MINUTE) 
            THEN 1 ELSE 0 END) AS 'OnlineTotal'
    FROM computers
相关问题