【问题标题】:How to make this MYSQL outer join work如何使这个 MYSQL 外连接工作
【发布时间】:2015-01-13 20:47:38
【问题描述】:

我有 4 张桌子:

comment (CommentID, StoryID, UserID, CommentContent), 
vote (VoteID, UserID, AnswerID), 
answer (AnswerID, StoryID, AnswerContent), 
user (UserID, Username)

所以我想获取故事 8 的所有 cmets 以及制作这些 cmets 的用户的信息(包括他们的投票信息)。并非所有制作 cmets 的用户都会投票。所以这是我的查询,但它不起作用

SELECT * FROM comment a 
  LEFT JOIN vote b ON a.UserID = b.UserID 
  JOIN answer c ON b.AnswerID = c.AnswerID 
  JOIN user d ON a.UserId = d.UserID  
GROUP BY a.CommentID HAVING a.StoryID = 8

我不知道为什么这个查询会显示不投票的评论者的投票结果。你能帮我修一下吗?非常感谢。

【问题讨论】:

  • “没有工作”不是一个非常具有描述性的。查询是否返回错误?返回意外结果?你期待什么结果?该查询将针对每个 CommentId 返回一行,因为GROUP BY CommentId 子句会将所有投票、答案和用户行“折叠”成仅针对给定CommentId 返回的一行。从这些表中为列返回的值将来自组中的某行,但哪一行是不确定的。
  • 感谢您的回复。一位没有投票的评论员显示了他的投票结果。他的投票结果应该是空的,因为他没有投票。

标签: mysql join outer-join


【解决方案1】:

您的 GROUP BY 和 HAVING 子句不正确。

SELECT * FROM comment a 
  LEFT JOIN vote b ON a.UserID = b.UserID 
  JOIN answer c ON b.AnswerID = c.AnswerID
  WHERE a.StoryID = 8

【讨论】:

  • 如果您希望所有用户无论他们是否发表评论,您都需要对“用户”表使用“RIGHT JOIN”。缺失值将显示为 NULL。
猜你喜欢
  • 2012-07-23
  • 2016-04-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 2020-10-27
  • 2011-12-23
相关资源
最近更新 更多