从两个表中获取数据,具体取决于单个查询中的数据

时间:2009-03-29 00:41:36

标签: sql

我正在创建一个简单的论坛,并且在线程的列表中我想要显示经典的“(用户)在(日期)的最后发表”。我只使用一个表来包含论坛中的所有帖子,其中parentPost-field不等于null的帖子是对帖子的回复。

这些是我需要数据的表格和必要字段:

forumPosts
  • id :整数,主键
  • 标题:字符串值
  • 日期:字符串值
  • parentPost :整数(此字段=主题中初始帖子的ID。如果为NULL,则帖子为“初始帖子帖子”)
  • 作者:整数,用户表的外键
  • countAnswers :整数
  • lastPost :整数,(此字段=回复的最后一个帖子的ID。仅在parentPost-field = NULL时使用)
用户
  • userid :整数,主键
  • firstName :字符串值
  • lastName :字符串值

截至目前,我有这个问题:

SELECT forumPosts.id, forumPosts.title, forumPosts.date, forumPosts.author, forumPosts.countAnswers, users.firstName, users.lastName 
FROM forumPosts 
INNER JOIN users ON forumPosts.author = users.userid 
WHERE forumPosts.parentPost IS NULL ORDER BY id DESC;

返回我需要的所有内容(ID,标题,日期,作者及其拥有的回复数),但上次发布回复的日期和作者除外。

此外,我想获取以下内容:

帖子中最后一篇帖子的日期,即ID parentPost = forumPosts.id最高的帖子。我还想从发布此回复的用户那里获取firstName和lastName。

我一直在玩弄不同的连接和派生表等很长一段时间,但我似乎无法做到这一点。理想情况下,我想要一个带有以下字段的表:

  • ID
  • 标题
  • 日期
  • 的firstName
  • lastName的
  • countAnswers
  • lastReplyDate
  • lastReplyFirstName
  • lastReplyLastName

对我来说,似乎有可能,但我显然无法做到。

我希望你能理解我有些复杂的问题,并且非常感谢你们所有答案。

溶剂

SELECT        forumPosts.id, forumPosts.title, forumPosts.date, forumPosts.author, forumPosts.countAnswers, users.firstName, users.lastName, 
                     lastPost.date AS lastPostDate, lastUser.firstName AS lastPostFirstName, lastUser.lastName AS lastPostLastName
FROM            forumPosts AS lastPost INNER JOIN
                     users AS lastUser ON lastPost.author = lastUser.userid INNER JOIN
                     forumPosts INNER JOIN
                     users ON forumPosts.author = users.userid ON lastPost.id = forumPosts.lastPost
WHERE        (forumPosts.parentPost IS NULL)
ORDER BY forumPosts.id DESC

那很有用。这么典型,在我花了很多时间写这篇文章后一分钟找到我自己的答案: - \

2 个答案:

答案 0 :(得分:2)

如果“线程”是您系统的一个重要概念 - 而且看起来就是这种情况 - 我会将其建模为一个单独的实体。通过没有父母的帖子来识别线索会让你感到悲伤,因为你刚刚开始发现。

一方面找到所有主题:

SELECT ... FROM posts WHERE parent IS NULL

取决于数据库供应商通常不具备性能,因为通常不会对NULL值建立索引。

创建一个Thread表,所有这些问题都会消失。

答案 1 :(得分:1)

SELECT f.id, f.title, f.date, 
 u1.firstName, u1.lastName, f.countAnswers,
 r1.date AS lastReplyDate,
 u2.firstName AS lastReplyFirstName
 u2.lastName AS lastReplyLastName
FROM forumPosts f
 INNER JOIN users u1 ON (f.author = u1.userid)
 LEFT OUTER JOIN (forumPosts r1 INNER JOIN users u2 ON r1.author = u2.userid)
  ON (f.id = r1.parentPost)
 LEFT OUTER JOIN forumPosts r2 
  ON (f.id = r1.parentPost AND r1.id < r2.id)
WHERE f.parentPost IS NULL 
 AND r2.id IS NULL
ORDER BY f.id DESC;