【问题标题】:How can I get a non empty result set when using select, group by and count?使用 select、group by 和 count 时如何获得非空结果集?
【发布时间】:2013-02-01 10:56:38
【问题描述】:

这是当前查询:

SELECT status.ct_reconcile_status, 
       IFNULL(COUNT(status.ct_reconcile_status), 0) AS sch_change_status_num 
FROM   db_crewops_cm_action status 
WHERE  status.ct_reconcile_status IN ( 'SUCCESS', 'FAILED' ) 
       AND status.updated_ts > UTC_TIMESTAMP() - INTERVAL 60 minute 
GROUP  BY status.ct_reconcile_status; 

而我想要得到的结果是这样的:

SUCCESS   5
FAILED    9

没关系。问题是我可能会遇到两种状态的结果数都是 0 的情况,在这种情况下我想要这样:

SUCCESS   0
FAILED    0

而不是空的结果集(我现在得到的)。我有一个一般的想法,我应该加入表本身或使用 WITH 子句,但我不知道如何开始。

【问题讨论】:

    标签: mysql select count group-by


    【解决方案1】:

    尝试类似:

    SELECT a.status AS ct_reconcile_status,
           (IFNULL(b.sch_change_status_num,0) + a.num) AS sch_change_status_num
    FROM
      (SELECT 'SUCCESS' AS status, 0 AS num
       UNION
       SELECT 'FAILED', 0) a
    LEFT JOIN
      (SELECT status.ct_reconcile_status, 
              COUNT(status.ct_reconcile_status) AS sch_change_status_num 
       FROM   db_crewops_cm_action status 
       WHERE  status.ct_reconcile_status IN ( 'SUCCESS', 'FAILED' ) 
              AND status.updated_ts > UTC_TIMESTAMP() - INTERVAL 60 minute 
       GROUP  BY status.ct_reconcile_status) b
    ON a.status = b.ct_reconcile_status
    

    您可以删除status.ct_reconcile_status IN ( 'SUCCESS', 'FAILED' ) AND,但这可能会更慢。

    【讨论】:

      猜你喜欢
      • 2016-04-22
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多