0

不确定我的标题是否很好地解释了它,所以这里有一个例子。我有两个 MYSQL 表,comments 和 votes_comments,它们根据字段 comment_id 匹配。对于示例数据,评论有两行,而 votes_comments 有一行与评论行之一匹配。AKA 写了两条评论,一个人对其中一条进行了投票 鉴于此,以下查询返回 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_comments。我想要做的是获取匹配值(如果存在),或者如果没有匹配结果,则在列中返回 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_comments 中只有一行。我认为左连接会以我想要的方式返回结果,但显然不是。任何想法如何得到我正在寻找的东西?

4

2 回答 2

1

我怀疑该WHERE条款AND votes_comments.user_id=1导致了问题。

阅读有关联接的教程,您会看到您的结果LEFT JOIN是一个包含两行的临时表,并且对于每一行,字段 fromcomments JOIN users和 from votes_comments。如果不votes_comments存在匹配的记录,则临时表中的字段将填充NULL值。

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

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

ON votes_comments.comment_id = comments.comment_id
    AND votes_comments.user_id=1
于 2012-04-10T06:45:01.550 回答
0

如果您想拥有两个表中的行,您可以考虑使用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总结有关它的更多信息

于 2012-04-10T06:30:11.980 回答