【问题标题】:Multiple MySQL count in a single query单个查询中的多个 MySQL 计数
【发布时间】:2019-01-12 03:15:11
【问题描述】:

我目前有多个查询 1 想收集到一个中,它们是相同的,只是日期范围在变化:

查询 1:

SELECT COUNT(simp_posts.ID)
FROM simp_posts
INNER JOIN simp_postmeta
ON ( simp_posts.ID = simp_postmeta.post_id )
WHERE ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value = '0' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-08-01 23:33:51' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-08-01 23:33:51' AND simp_posts.post_status = 'wc-pending-cancel'))

查询 2:

SELECT COUNT(simp_posts.ID)
FROM simp_posts
INNER JOIN simp_postmeta
ON ( simp_posts.ID = simp_postmeta.post_id )
WHERE ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value = '0' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-09-01 23:33:51' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-09-01 23:33:51' AND simp_posts.post_status = 'wc-pending-cancel'))

查询 3:

SELECT COUNT(simp_posts.ID)
FROM simp_posts
INNER JOIN simp_postmeta
ON ( simp_posts.ID = simp_postmeta.post_id )
WHERE ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value = '0' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-10-01 23:33:51' AND simp_posts.post_status = 'wc-active'))
OR ( ( simp_postmeta.meta_key = '_schedule_end' AND simp_postmeta.meta_value > '2018-10-01 23:33:51' AND simp_posts.post_status = 'wc-pending-cancel'))

我希望将这些查询合并为一个,结果为 3 行,每个计数的结果为 1。 例如我会得到: 182 183 194

感谢您的帮助

【问题讨论】:

    标签: mysql sql database relational-database mariadb


    【解决方案1】:

    在 MySQL 中,您可以通过使用带有布尔值的 SUM() 来简化答案。

    你的逻辑很复杂。我认为它可以简化为:

    SELECT SUM((pm.meta_value = '0' AND p.post_status = 'wc-active') or pm.meta_value > '2018-09-01 23:33:51'),
           SUM((pm.meta_value = '0' AND p.post_status = 'wc-active') or pm.meta_value > '2018-10-01 23:33:51'),
    SUM((pm.meta_value = '0' AND p.post_status = 'wc-active') or pm.meta_value > '2018-10-01 23:33:51')
    FROM simp_posts p INNER JOIN
         simp_postmeta pm
         ON p.ID = pm.post_id
    WHERE pm.meta_key = '_schedule_end' AND
          p.post_status IN ('wc-active', 'wc-pending-cancel')
    

    【讨论】:

    • 谢谢你,它是完美的! :)
    【解决方案2】:

    拥有where 中的通用条件,并在日期范围内有条件地聚合。 请注意 @Tim 在 cmets 中提到的内容。如果计数必须互斥,则在case 表达式中包含meta_value 的范围。

    SELECT COUNT(CASE WHEN simp_postmeta.meta_value > '2018-08-01 23:33:51' 
                      THEN simp_posts.ID END)
    ,COUNT(CASE WHEN simp_postmeta.meta_value > '2018-09-01 23:33:51' 
                THEN simp_posts.ID END)
    ,COUNT(CASE WHEN simp_postmeta.meta_value > '2018-10-01 23:33:51' 
                THEN simp_posts.ID END)
    FROM simp_posts
    INNER JOIN simp_postmeta ON simp_posts.ID = simp_postmeta.post_id
    WHERE simp_postmeta.meta_key = '_schedule_end' 
    AND simp_posts.post_status IN ('wc-active','wc-pending-cancel')
    

    【讨论】:

    • 这确实是正确的答案,但我认为您的日期范围会加倍计算,例如2018-09-02 将被两个计数语句计数,而 OP 可能实际上并不打算这样做。
    • 感谢您的回答,但是当我尝试时,这并没有给我正确的计数。但没关系,戈登的回答如下:)谢谢
    猜你喜欢
    • 1970-01-01
    • 2014-05-08
    • 2019-02-04
    • 2010-11-19
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多