【问题标题】:MySQL COUNT return 0 if it's not nullMySQL COUNT 如果不为空则返回 0
【发布时间】:2020-10-05 10:38:55
【问题描述】:

我需要计算日期之间的所有文章。我使用了IFNULL(COUNT(*), 0),它返回null。

SELECT posts_count, dates.fulldate
FROM dates
LEFT JOIN 
   (SELECT IFNULL(COUNT(post_id), 0) AS posts_count, DATE_FORMAT(post_created_at, "%Y-%m-%d") AS pdate
   FROM posts
   WHERE DATE_FORMAT(post_created_at, "%Y-%m-%d") BETWEEN NOW() - INTERVAL 31 DAY AND NOW()
   GROUP BY DATE_FORMAT(post_created_at, "%Y-%m-%d")) t
ON t.pdate = dates.fulldate
WHERE dates.fulldate BETWEEN CURDATE() - INTERVAL 31 DAY AND CURDATE() ORDER BY dates.fulldate ASC;

结果是:

NULL |  2020-05-20    
NULL |  2020-05-21    
NULL |  2020-05-22    
7634 |  2020-05-23    
51224 | 2020-05-24

我想要的结果:

   0 |  2020-06-16   
1233 |  2020-06-15    
4354 |  2020-06-14   
   0 |  2020-06-13    
   0 |  2020-06-12

【问题讨论】:

  • 能否添加结果的数据源?

标签: mysql sql count aggregate-functions date-arithmetic


【解决方案1】:

您的查询似乎比需要的复杂。我看不到按日期对帖子进行分组并在日期上过滤两次的子查询的意义。

我认为你想要的逻辑是:

select count(p.post_id) post_count, d.fulldate
from dates d
left join posts p
    on  p.post_created_at >= d.fulldate
    and p.post_created_at <  d.fulldate + interval 1 day
where d.fulldate >= current_date - interval 1 month
group by d.fulldate
order by d.fulldate

我希望这应该比您的原始代码更有效,特别是因为没有在发布日期列上应用日期函数。我建议在posts(post_created_at) 上建立一个索引,以充分利用这段代码。

【讨论】:

    【解决方案2】:

    您需要在主查询中执行IFNULL(),而不是子查询。子查询没有返回缺失日期的任何行,因此甚至没有空计数可以转换为 0。

    SELECT IFNULL(posts_count, 0) AS posts_count, dates.fulldate
    FROM dates
    LEFT JOIN 
       (SELECT COUNT(*) AS posts_count, DATE_FORMAT(post_created_at, "%Y-%m-%d") AS pdate
       FROM posts
       WHERE DATE_FORMAT(post_created_at, "%Y-%m-%d") BETWEEN NOW() - INTERVAL 31 DAY AND NOW()
       GROUP BY DATE_FORMAT(post_created_at, "%Y-%m-%d")) t
    ON t.pdate = dates.fulldate
    WHERE dates.fulldate BETWEEN CURDATE() - INTERVAL 31 DAY AND CURDATE() 
    ORDER BY dates.fulldate ASC;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 2020-12-22
      • 2020-08-09
      相关资源
      最近更新 更多