【问题标题】:MySQL join not returning the rows when trying to count from left table尝试从左表计数时,MySQL连接不返回行
【发布时间】:2020-07-18 10:22:05
【问题描述】:

我有 2 个表格、文章和 article_cmets。试图获取文章列表页面上的评论计数。但是,我的查询不会返回任何没有任何评论的文章。

SELECT `articles`.*, COUNT(comments.id) AS comment_count 
FROM `articles` as `articles` 
LEFT JOIN `article_comments` as `comments` ON `articles`.`id` = `comments`.`article_id`

如果该帖子没有 cmets,如何使查询返回具有 comment_count0 的文章的所有行?

【问题讨论】:

  • 正如所写的那样,查询应该做你想做的事情(尽管对于没有 cmets 的任何文章,它会将 NULL 提供为 comment_count;你可以将其转换为 0COALESCE)。是否有 WHERE 子句您没有向我们展示?
  • 我在您的查询中没有看到 GROUP BY 子句。您必须使用函数的窗口变体:SELECT `articles`.*, COUNT(comments.id) OVER () AS comment_count ...
  • @Nick 没有 where 子句。问题是它没有返回没有评论的文章。
  • 请通过编辑而非 cmets 进行澄清。但是——这是一个常见问题。 (显然。)在考虑发布之前,请阅读手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出您可以给出的最少代码,即您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。

标签: php mysql sql join group-by


【解决方案1】:

显然您的查询缺少GROUP BY 子句,它应该枚举articles 表中的所有列 - 或者,如果您在禁用sql 模式ONLY_FULL_GROUP_BY 的情况下运行MySQL,它应该包含@ 的主键987654324@.

使用相关子查询来表达这一点可能更简单:

select 
    a.*,
    coalesce(
        (select count(*) from article_comments ac where ac.article_id = a.id),
        0
    ) comments_count
from articles a

您也可以在子查询中预先聚合:

select
    a.*,
    coalesce(c.comments_count, 0) comments_count
from articles a
left join (
    select article_id, count(*) comments_count
    from article_comments
    group by article_id
) c on c.article_id = a.id

【讨论】:

    猜你喜欢
    • 2013-02-18
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    相关资源
    最近更新 更多