簡體   English   中英

MySQL COUNT 如果不是 null,則返回 0

[英]MySQL COUNT return 0 if it's not null

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

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

您的查詢似乎比它需要的更復雜。 我看不到按日期對帖子進行分組並在日期上過濾兩次的子查詢的意義。

我認為你想要的邏輯是:

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

我希望這應該比您的原始代碼更有效,特別是因為沒有在發布日期列上應用日期 function。 我建議在posts(post_created_at)上建立一個索引,以充分利用這段代碼。

您需要在主查詢中執行IFNULL() ,而不是子查詢。 子查詢沒有返回缺少日期的任何行,因此甚至沒有 null 計數可以轉換為 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM