SQL:联接父-子表

SQL:联接父-子表,sql,sql-server,inner-join,outer-join,Sql,Sql Server,Inner Join,Outer Join,我正在构建一个简单的评论网站应用程序,需要一些SQL查询方面的帮助 共有3个表(主题、注释、用户)。我需要一个SQL查询来从所有3个表中选择数据 “Topics”表是父级,“Comments”表包含子记录(每个父级从零到100条记录) 第三个表“Users”包含所有用户的用户信息 以下是3个表的字段: Topics (topicID, strTopic, userID) Comments (commentID, topicID, strComment, userID) Users (userID

我正在构建一个简单的评论网站应用程序,需要一些SQL查询方面的帮助

共有3个表(主题、注释、用户)。我需要一个SQL查询来从所有3个表中选择数据

“Topics”表是父级,“Comments”表包含子记录(每个父级从零到100条记录)

第三个表“Users”包含所有用户的用户信息

以下是3个表的字段:

Topics (topicID, strTopic, userID)
Comments (commentID, topicID, strComment, userID)
Users (userID, userName)
我试过:

SELECT * 
FROM   Topics 
  Inner Join Comments ON Topics.topicID = Comments.topicID
  Inner Join Users ON Topics.userID = Users.userID

但这无法正常工作,因为存在多个主题,并且用户信息未加入到评论表中。请提供任何帮助。

您需要加入到用户表两次

SELECT *
FROM Topics
 INNER JOIN Comments ON Topics.topicID = Comments.topicID
 INNER JOIN Users AS u1 ON Topics.userID = u1.userID
 INNER JOIN Users AS u2 ON Comments.userID = u2.userID

您应该使用left join with Comment来获取没有注释的主题,还应该使用用户来加入主题和注释来获取两者的相关用户信息

SELECT * 
FROM Topics t
INNER JOIN Users tu on tu.userID = t.userID
LEFT JOIN Comments c on c.topicID = t.topicID
LEFT JOIN User cu on cu.userID = c.userID

是否希望结果包含没有注释的主题?您想完成什么?是否要查找用户的所有活动?对特定主题的所有注释,包括用户名?此外,通常不建议使用变量类型作为列名的前缀/后缀(因此,不要使用
str..
)。您还可以从将时间戳附加到表中获益,原因有很多。结果应该是包含每个注释的所有特定用户主题的列表(如果有)在主题下面。为了简洁起见,我的expample中的DB模式进行了简化,主题和注释以及其他字段都有时间戳。我不确定如何通过迭代一个记录集来完成。这是可行的,只是当没有注释时,查询会丢失topics表中的一些数据。这实际上不是mi在处理数据时,返回的userID是Topics表中的userID,即使有注释记录也是如此。不应该是这样。可能topic userID和Comment userID是相同的,这就是为什么它返回相同的两次。这就是问题所在。我为字段添加了一个别名,一切正常。