我正在创建一个简单的论坛,并且在线程的列表中我想要显示经典的“(用户)在(日期)的最后发表”。我只使用一个表来包含论坛中的所有帖子,其中parentPost-field不等于null的帖子是对帖子的回复。
这些是我需要数据的表格和必要字段:
forumPosts截至目前,我有这个问题:
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。
我一直在玩弄不同的连接和派生表等很长一段时间,但我似乎无法做到这一点。理想情况下,我想要一个带有以下字段的表:
对我来说,似乎有可能,但我显然无法做到。
我希望你能理解我有些复杂的问题,并且非常感谢你们所有答案。
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
那很有用。这么典型,在我花了很多时间写这篇文章后一分钟找到我自己的答案: - \
答案 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;