我正在尝试获取数据库中所有父帖子的列表,并按该线程的最新活动进行排序。这意味着检查该线程的最新帖子-如果有子帖子,则检查其最新日期,如果不是,则检查父日期。
我有一个名为“ posts”的表,该表包含以下内容:
如果某个帖子是父级(主题的第一篇帖子):主题不为null,则Parent_ID为null。看起来像这样:
ID | Name | Message | Date | File | Topic | Parent_ID
=====================================================
1 | Joe | Wee! | Date | File | Blah! | NULL
如果帖子是子项(线程中的帖子=父级ID):主题为空,则Parent_ID不为空。看起来像这样:
ID | Name | Message | Date | File | Topic | Parent_ID
=====================================================
2 | Mike | Hi! | Date | File | NULL | 1
我已经很接近了。我认为这与With Clause有关。到目前为止,这是我想出的:
WITH threads AS (
SELECT ID,Name,Date,File,Topic,Parent_ID FROM posts WHERE Parent_ID IS NULL
UNION ALL
SELECT Parent_ID,Name,Date,File,Topic,Parent_ID FROM posts WHERE Parent_ID NOTNULL ORDER BY Date DESC
)
SELECT * FROM threads GROUP BY ID ORDER BY Threads.date;
我已经知道我可以搜索类似的问题。我已经尝试过了,但仍未得出确切结论。任何帮助将不胜感激。
另外,我应该换张桌子吗?也许添加一个线程列甚至一个线程表之类的东西来简化事情?
答案 0 :(得分:0)
AllDates
是标准的树步,并收集每个主题的所有日期; TopID
会在所有迭代中保留下来,以便可以将最后一个日期与之关联。
LastDates
然后丢弃所有不是最后日期的行。
WITH RECURSIVE AllDates(TopID, ID, Date) AS (
SELECT ID, ID, Date
FROM Threads
WHERE Parent_ID IS NULL
UNION ALL
SELECT AllDates.TopID, Threads.ID, Threads.Date
FROM AllDates
JOIN Threads ON AllDates.ID = Threads.Parent_ID
),
LastDates(ID, LastDate) AS (
SELECT TopID, max(Date)
FROM AllDates
GROUP BY TopID
)
SELECT *
FROM Threads
JOIN LastDates USING (ID)
-- WHERE Parent_ID IS NULL (not needed because of the join)
ORDER BY LastDate DESC;
(如果每个帖子都有对该线程的引用,这将更加容易和快捷。)