【问题标题】:Get Count 0 instead of NULL MySQL Query获取计数 0 而不是 NULL MySQL 查询
【发布时间】:2014-04-20 13:19:40
【问题描述】:

我有一个查询,可以计算一个月内带有特定标签的帖子数量,但显然如果没有帖子,我的WHERE 将不会返回任何内容。问题在于,我在图表上覆盖了另一个显示所有帖子的查询,而不仅仅是满足这些WHERE 条件的帖子。第二个查询通常每个月都有一个结果。如果结果为空,如何让此查询返回零?我在这里阅读了一些答案,但无法完全弄清楚。

SELECT MONTHNAME(post_time) AS month, 
       COALESCE(Count(distinct p.post_id), 0) AS count 
FROM post.p 
INNER JOIN post_tag_map t ON ( p.post_id = t.knote_id ) 
WHERE t.post_id IN (23,24,49,54) 
/*these numbers are actually a variable, this is just an example*/  
AND p.post_time >= (CURDATE() - INTERVAL 1 YEAR)

我试图从数据库的时间开始同时显示月份和帖子。

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    使用LEFT JOIN 包含不匹配的行:

    SELECT MONTHNAME(post_time) AS month, 
           COALESCE(COUNT(distinct t.knote_id), 0) AS count 
    FROM post AS p 
    LEFT JOIN post_tag_map AS t 
    ON p.post_id = t.knote_id AND t.post_id IN (23,24,49,54) 
    WHERE p.post_time >= (CURDATE() - INTERVAL 1 YEAR)
    GROUP BY month
    

    请注意,使用LEFT JOIN 时,必须将t 条件放在ON 子句中,而不是WHERE;否则,它们会在不匹配的行上失败。而且你必须从t开始计算列,所以它会跳过不匹配行的空值。

    DEMO

    【讨论】:

    • 这看起来不错,但它仍然没有返回 3 月份的任何内容(总共 0 个帖子,所以这对我来说很有意义,但不是想要的结果)。
    • 您需要加入一个包含月份的表。请参阅 stackoverflow.com/questions/23130805/… 了解动态创建它的方法。
    • 好的。同一张表确实包含月份。如果我不做 WHERE IN,他们就会出现。如果这有意义的话。
    • 我的回答中没有WHERE IN。我将IN 条件移至ON 子句以解决该问题。
    • Err - 我的意思是...包含帖子的表格,每个月都有帖子。不一定是那些用这个特定标签 (23,24,49,54) 标记的人。如果我在没有IN 的情况下运行此查询,则显示那些月份。我想知道是否可以在不为几个月创建单独的表的情况下做到这一点。
    【解决方案2】:

    尝试使用 ISNULL(amount,0) 函数:

    SELECT MONTHNAME(post_time) AS month, 
    ISNULL(Count(distinct p.post_id), 0) AS count 
    FROM post.p 
    INNER JOIN post_tag_map t ON ( p.post_id = t.knote_id ) 
    WHERE t.post_id IN (23,24,49,54) 
    /*these numbers are actually a variable, this is just an example*/  
    AND p.post_time >= (CURDATE() - INTERVAL 1 YEAR)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 2018-11-19
      相关资源
      最近更新 更多