【问题标题】:SQL: Join Parent - Child tablesSQL:加入父 - 子表
【发布时间】:2012-07-09 07:28:27
【问题描述】:

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

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

“主题”表是父表,“评论”表包含子记录(每个父表的记录从 0 到 100 条不等。

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

以下是 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

但这不能正常工作,因为有多个主题并且用户信息未加入评论表。任何帮助将不胜感激。

【问题讨论】:

  • 您希望结果包含没有 cmets 的主题吗?
  • 你想要完成什么?您想查找用户的所有活动吗?所有关于特定主题的 cmets,包括用户名?此外,使用变量类型为列名添加前缀/后缀通常不是一个好主意(因此,不要使用str...)。出于多种原因,您还可以从将时间戳附加到表中受益。
  • 结果应该是所有特定用户主题的列表以及主题下方的每个评论(如果有的话)。为了简洁起见,我的示例中的 DB 模式进行了简化,主题和 cmets 以及其他字段都有时间戳。我不确定如何通过一个记录集进行迭代。

标签: sql sql-server inner-join outer-join


【解决方案1】:

您应该使用 Comment 左连接来获取没有 cmets 的主题,还应该将 Topic 和 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

【讨论】:

  • 这有效,只是当没有 cmets 时,查询会丢失主题表中的一些数据。
  • 实际上不是丢失数据,而是返回的用户ID是Topics表中的用户ID,即使有评论记录。
  • 不应该这样。也许主题 userId 和评论 userId 是相同的,这就是为什么它返回相同的两次。
  • 这就是问题所在。我为该字段添加了一个别名,一切正常。
【解决方案2】:

你需要加入用户表两次。

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

【讨论】:

    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多