Sqlite-如何基于子项订购父级帖子列表

时间:2018-08-15 21:58:01

标签: sqlite sorting parent-child

我正在尝试获取数据库中所有父帖子的列表,并按该线程的最新活动进行排序。这意味着检查该线程的最新帖子-如果有子帖子,则检查其最新日期,如果不是,则检查父日期。

我有一个名为“ 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;

我已经知道我可以搜索类似的问题。我已经尝试过了,但仍未得出确切结论。任何帮助将不胜感激。

另外,我应该换张桌子吗?也许添加一个线程列甚至一个线程表之类的东西来简化事情?

1 个答案:

答案 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;

(如果每个帖子都有对该线程的引用,这将更加容易和快捷。)