【问题标题】:GROUP BY query not showing empty categoriesGROUP BY 查询不显示空类别
【发布时间】:2015-12-07 10:21:45
【问题描述】:

我有以下内容

SELECT
        help_categories.helpCatId,
        help_categories.helpCatName,
        help_categories.helpCatSlug,
        COUNT(help_articles.helpArtCatId)
FROM
        help_categories
            JOIN
                help_articles
                    ON help_categories.helpCatId = help_articles.helpArtCatId
WHERE 
        help_categories.helpCatActive = 1
    AND
        help_articles.helpArtActive = 1
GROUP BY
        help_articles.helpArtCatId
ORDER BY
        help_categories.helpCatId ASC

此查询从数据库中选择所有帮助类别,并统计其中的所有文章。

问题:当一个分类有 0 篇文章时,它不会被抓取。

这是一个很好的查询,还是有人知道更好的方法。所以我想要所有类别+每个类别中的文章数量(即使一个类别有 0 篇文章我仍然想从数据库中获取类别数据)。

提前致谢!

【问题讨论】:

  • +赞成这个问题,因为其他人都给出了与问题没有直接关系的答案:-/

标签: mysql join group-by


【解决方案1】:

您的WHERE 子句取消了具有空值的LEFT JOIN 的工作:... AND help_articles.helpArtActive = 1。这需要一个“OR NULL”:

应该是:

WHERE 
        help_categories.helpCatActive = 1
    AND
        (help_articles.helpArtActive = 1
         OR
         help_articles.helpArtActive IS NULL
         )

编辑,基于 cmets:

另外,GROUP BY help_articles.helpArtCatId 将把help_articles.helpArtCatId NULL 放在一起。可以改为GROUP BY help_categories.helpCatId

【讨论】:

  • 它几乎可以工作了...我目前有 7 个类别,只有前 3 个有文章。使用您的解决方案,还显示了第 4 个类别(带有消息“未找到文章”),但未获取最后 3 个类别。 (我将 JOIN 更改为 LEFT JOIN ofc)。它们都处于活动状态(helpCatActive = 1)。
  • 这是因为 GROUP BY help_articles.helpArtCatId 将 NULL 放在一起。您可能想改用GROUP BY help_categories.helpCatId。 (这可能需要对查询进行额外的更改。)
  • 解决了!非常感谢您的无液!
【解决方案2】:

你想要一个left join。这允许您从查询的“左侧”检索所有行,而不管查询的“右侧”是否存在匹配项。

【讨论】:

  • 感谢内维尔,但它给了我完全相同的结果。你能给我一个小提示如何更改我的查询吗?如果我只是将“JOIN”更改为“LEFT JOIN”,它不会改变输出...我想我还必须更改 WHERE 分句...
  • 如果您发布带有示例数据的 SQLFiddle,您可能会在几秒钟内得到答案。
【解决方案3】:

使用 LEFT JOIN 代替 JOIN。

【讨论】:

  • LEFT JOIN 给了我完全相同的结果。我知道解决方案是使用 LEFT JOIN 虽然...:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多