【问题标题】:MySQL JOINED table query should return zero but instead does not return those rowsMySQL JOINED 表查询应返回零,但不返回那些行
【发布时间】:2022-01-01 06:03:11
【问题描述】:
SELECT sg.date, sg.groupName, sg.highlights, 
        user.display_name as displayName,
        COUNT(uc.groupName) 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
WHERE uc.deleted=0
GROUP BY sg.groupName

我有两个表,saved_groupsuser_comments,查询的第二行应该(确实有效)返回一个额外的列,其中包含与每个组关联的 cmets 的数量。

但是,当一个组与它关联的 cmets 为零时,该组根本不会返回。返回的唯一行是具有> 0 cmets 的行。期望的行为是返回所有 groupNames,并为 uc 表中具有零关联 cmets 的那些行指定 0。

如何解决这个问题?

我试过了:IF(uc.deleted=1, 0, COUNT(uc.groupName)) as cmtcnt——但这没什么区别,返回的结果相同。

目前,我不确定接下来要尝试什么。

建议?

更新:

试过这个:

SELECT sg.date, sg.groupName, sg.highlights, 
        user.display_name as displayName,
        COUNT(uc.groupName) as cmtcnt
FROM geom.saved_groups as sg
    JOIN geom.user on user.email = sg.userName
    JOIN geom.user_comments as uc on sg.groupName = uc.groupName
WHERE isnull(uc.deleted,0) in (0,1)
GROUP BY sg.groupName

得到: #1582 - Incorrect parameter count in the call to native function 'isnull'

【问题讨论】:

  • 将条件uc.deleted=0移到ON子句中。

标签: mysql sql mariadb


【解决方案1】:

您想要所有记录?然后删除WHERE 子句。您想要0 来获取没有计数的记录吗?使用COALESCE。像这样:

SELECT sg.date
, sg.groupName
, sg.highlights
, user.display_name as displayName
, COALESCE(COUNT(uc.groupName), 0) 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 
AND uc.deleted = 0 -- to get only comments that have not been deleted, and not the deleted ones
GROUP BY sg.groupName

【讨论】:

  • 哈!那行得通。我实际上尝试了COALESCE,但它与 WHERE 子句结合使用,我认为它甚至不值得一提,因为它似乎没有任何区别(由于 WHERE 子句,我现在知道了)我>。你给了我缺失的信息。非常感谢。
  • COUNT(uc.groupName) 永远不会返回 null,因此 COALESCE() 没用。 ON 子句有何不同。
  • @forpas 我对 mysql 和 coalesce 不太确定(mysql 有时会有/有意外行为(对我来说,无论如何)),所以添加它以确保。
  • @HoneyBadger 对不起,我一定是实施不正确 - 再次尝试更新我的反馈,它像宣传的那样工作。非常感谢您更新您的答案以涵盖 AND 条件 - 效果很好。
【解决方案2】:

您的 where 条件是过滤记录并仅返回那些在 uc 中有数据的记录,因此左连接没有好处。你可以做 (uc.deleted=0 or uc.deleted is null) 要么 移动条件 uc.deleted with on condition with join

【讨论】:

  • 我不明白如何实施您的建议 - 我将如何调整我的查询? (请提供示例代码)我一直在尝试对此进行测试,但无法获得正确的语法。
【解决方案3】:

检查是否 uc.deleted=0 并删除 where 条件。 and 处理左连接的非空条件

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

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 2019-02-25
    • 1970-01-01
    相关资源
    最近更新 更多