MySQL JOINED table 添加 Count() 列的查询 returns 零匹配时为 1

MySQL JOINED table query that adds a Count() column returns 1 when zero match

SELECT sg.date, sg.groupName, sg.highlights, user.display_name as displayName,
        COUNT(*) as cmtcnt
        FROM `saved_groups` as sg
        LEFT JOIN `user` on user.email = sg.userName
        LEFT JOIN `user_comments` as uc on sg.groupName = uc.groupName
        GROUP BY sg.groupName

我有两个表,saved_groupsuser_comments,查询的第二行应该(确实有效)return 一个额外的列,其中包含与每组.

但是,当一个群组有零条与之关联的评论时,计数 returns 1 应该 return 为零。

我该如何修正这个查询?

我试过:COUNT(*)-1 as cmtcnt -- 对于没有评论的组,return 为零,但对于有评论的组,return 也是一个不正确的数字 (-1)相关评论。

我也试过:NULL(Count(*), 0)——但是 #1582 - Incorrect parameter count in the call to native function 'ISNULL'

出错了

我也试过:COALESCE(COUNT(*), 0) as cmtcnt——这没有任何区别(return对所有评论为零的组编辑 1,对其他评论正确)

建议?

当您说 count(*) 时,您正在计算所有 table 中的所有事物。 因为 saved_groups 有一行,所以你得到返回的 1,这是正确的。

你想要的是只统计评论。所以你应该使用 COUNT(uc.*) as cmtcnt.

而不是 COUNT(*) as cmtcnt

这告诉查询只计算来自 uc table 的行数。

COUNT() 聚合函数从不 returns nullCOUNT(*) 总是 returns 一个大于 0 的值,因为它计算所有行结果集。

你想要的是计算 user_comments 中与 ON 子句中的条件匹配的行,你可以通过在括号内指定列 groupName 来做到这一点:

COUNT(uc.groupName)

这样只会计算非空行,如果对于特定 sg.groupNameuser_comments 中没有匹配的行,您可以获得 0