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_groups
和 user_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 null
和 COUNT(*)
总是 returns 一个大于 0
的值,因为它计算所有行结果集。
你想要的是计算 user_comments
中与 ON
子句中的条件匹配的行,你可以通过在括号内指定列 groupName
来做到这一点:
COUNT(uc.groupName)
这样只会计算非空行,如果对于特定 sg.groupName
在 user_comments
中没有匹配的行,您可以获得 0
。
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_groups
和 user_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 null
和 COUNT(*)
总是 returns 一个大于 0
的值,因为它计算所有行结果集。
你想要的是计算 user_comments
中与 ON
子句中的条件匹配的行,你可以通过在括号内指定列 groupName
来做到这一点:
COUNT(uc.groupName)
这样只会计算非空行,如果对于特定 sg.groupName
在 user_comments
中没有匹配的行,您可以获得 0
。