【问题标题】:Sqlite - How to order a list of parent posts based on childrenSqlite - 如何根据子级排序父级帖子列表
【发布时间】:2019-01-22 19:43:20
【问题描述】:

我正在尝试获取数据库中所有父帖子的列表,这些帖子按该线程的最新活动排序。这意味着检查该线程的最新帖子 - 如果有子帖子,则检查他们的最近日期,如果没有,则检查父母的日期。

我有一个名为“帖子”的表格,其中包含以下内容:

如果帖子是父帖子(主题的第一篇帖子):主题不为空,Parent_ID 为空。它看起来像这样:

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;

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

另外,我应该换桌子吗?也许添加一个线程列甚至一个线程表或其他东西以使事情变得更容易?

【问题讨论】:

  • 您熟悉递归 CTE 吗?
  • 不熟悉,但我正在阅读有关它的 With 子句。基本上搜索您之前进行的搜索,对吗?那我可以WITH RECURSIVE threads as... etc 吗?
  • 另外,这在 PHP 中更容易做到吗?从表中获取所有结果并在 PHP 中从结果数组中进行一些排序?
  • 这里有父/子层次结构的 CTE 的好例子:sqlite.org/lang_with.html

标签: sqlite sorting parent-child


【解决方案1】:

AllDates是标准的tree walk,收集每个主题的所有日期; 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;

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

【讨论】:

  • 我去看看。谢谢。此外,每个子帖子都通过 Parent_ID 引用线程,这是启动线程的帖子的 ID。
  • 所以所有其他帖子都被视为该顶级帖子的直接子级,并且没有树?在这种情况下,您不需要递归,LastDate 可以简单地遍历Threads 的所有行。
猜你喜欢
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 2015-03-19
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多