【问题标题】:How to properly join on a column in MYSQL which potentially has no matching results?如何正确连接 MYSQL 中可能没有匹配结果的列?
【发布时间】:2012-04-10 06:23:55
【问题描述】:

不确定我的标题是否很好地解释了它,所以这里有一个例子。我有两个 MYSQL 表 cmets 和 votes_cmets,它们根据字段 comment_id 进行匹配。对于样本数据,cmets 有两行,而 votes_cmets 有一行与 cmets 行之一匹配。 AKA 编写了两个 cmets,一个人对其中一个进行了投票 鉴于此,以下查询返回 2 行:

SELECT comments.*, users.username FROM comments 
JOIN users ON users.user_id = comments.user_id 
WHERE comments.track_id=6 AND comments.parent_id=-1
GROUP BY comments.comment_id

现在我想做的是加入可能有也可能没有匹配行的 votes_cmets。我想要做的是获取匹配值(如果存在),或者如果没有匹配结果,则在列中返回 null。又名:用户是否投票赞成、反对或根本不投票(空)。这是我修改后的查询:

SELECT comments.*, users.username, votes_comments.vote FROM comments 
JOIN users ON users.user_id = comments.user_id 
LEFT JOIN votes_comments ON votes_comments.comment_id = comments.comment_id
WHERE track_id=6 AND parent_id=-1 AND votes_comments.user_id=1
GROUP BY comments.comment_id

这个查询只返回一行,因为我在 votes_cmets 中只有一行。我认为左连接会以我想要的方式返回结果,但显然不是。任何想法如何得到我正在寻找的东西?

【问题讨论】:

  • 不清楚你想要得到什么结果。你能写出你做示例查询的表的文本输出,以及你希望返回的表吗?

标签: mysql select join


【解决方案1】:

我怀疑WHERE 子句AND votes_comments.user_id=1 导致了问题。

读取tutorial on Joins,您会看到LEFT JOIN 的结果是一个有两行的临时表,每一行都有来自comments JOIN usersvotes_comments 的字段。如果不存在来自votes_comments 的匹配记录,则临时表中的字段将填充NULL 值。

您的WHERE 子句AND votes_comments.user_id=1 将失败,因为votes_comments.user_iduser 的行中是NULL,没有匹配的votes_comments 记录。

如果您真正想要的是加入 votes_comments 中与特定用户 ID 匹配的行(例如 ID=1),那么您的 ON 子句应该类似于

ON votes_comments.comment_id = comments.comment_id
    AND votes_comments.user_id=1

【讨论】:

  • 嗯,有道理。删除 WHERE 子句似乎会产生两种结果。我仍然不确定如何实现我想要的结果,因为可以说另一个用户对另一个评论进行了投票。我现在将获得来自两个不同用户的所有结果和投票值。理想情况下,我要查找的是评论中的所有字段加上一个额外的列,如果有意义的话,它代表特定 user_id 的投票值(1、-1 或 null)。
  • 我已经扩展了我的答案以回应您在上面的评论中给出的修改后的问题。
  • 您的更新让我回到了我在帖子中使用的原始查询,该查询仅产生一个结果。我需要它返回两个结果,其中一个的“投票”列为 1,这是用户投票的结果,另一行的“投票”值为 null,因为用户没有投票那个。
  • 我的更新将AND votes_comments.user_id=1 放入ON 表达式中。您的原始问题将其放入 WHERE 表达式中。
  • 哦。我懂了。效果很好,谢谢:) 我不知道你甚至可以这样做。
【解决方案2】:

如果您想拥有两个表中的行,您可以考虑使用FULL OUTER JOIN。像这样:

SELECT comments.*, users.username, votes_comments.vote FROM comments 
JOIN users ON users.user_id = comments.user_id 
FULL OUTER JOIN votes_comments ON votes_comments.comment_id = comments.comment_id
AND votes_comments.user_id=1
WHERE track_id=6 AND parent_id=-1 
GROUP BY comments.comment_id

编辑

对此感到抱歉。你可以总结一个FULL OUTER JOIN阅读更多关于它herehere

【讨论】:

  • 从我正在阅读的内容看来,MYSQL 不支持 FULL OUTER JOIN,但有一些方法可以模拟它。现在正在调查。
猜你喜欢
  • 2018-08-07
  • 2021-08-23
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
相关资源
最近更新 更多