【发布时间】:2013-02-22 15:47:59
【问题描述】:
我正在尝试创建一个论坛设置,您可以在其中评论特定帖子并让回复按日期顺序显示在父级下方。在父级之下只会有一个子级。这是示例数据集:
ID.ParentID.Datestamp
12.NULL.2013-03-01 1:00pm
13.NULL.2013-03-01 2:00pm
14.12.2013-03-01 2:20pm
15.12.2013-03-01 2:30pm
16.NULL.2013-03-01 3:30pm
这就是我想要得到的结果:
12.NULL.2013-03-01 1:00pm
14.12.2013-03-01 2:20pm
15.12.2013-03-01 2:30pm
13.NULL.2013-03-01 2:00pm
16.NULL.2013-03-01 3:30pm
我知道我需要进行某种 CTE,但这不会将孩子排序在适当的父级下(显然,因为没有 ORDER BY 子句);我无法弄清楚正确的顺序。谁能提供一些见解?
; WITH Messages
AS
(
SELECT ID, ParentID, Datestamp
FROM ForumMessages
WHERE ParentID IS NULL
-- Recursive
UNION ALL
SELECT
t2.ID, t2.ParentID, t2.Datestamp
FROM
ForumMessages AS t2
JOIN Messages AS m ON t2.ParentID = m.ID
)
SELECT ID, ParentID, Datestamp
FROM Messages
【问题讨论】:
-
您的最终陈述是从 CTE 生成的集合中简单选择的。它没有 ORDER BY 子句。
-
是的。我尝试了一些东西,但无法弄清楚正确的顺序。你有答案吗?
-
另外,在您描述的(论坛)等真实应用程序中,您不会对数据库中的所有内容进行排序;相反,您会等到用户单击特定的论坛消息,然后才检索其相关的子帖子,您可以按 datetime-posted 排序。
-
此外,子帖子可以有子子帖子。带有 sub-sub-postings 的 subposting 将具有 parent-id,并且它们不会包含在查找 ParentId 为 null 的查询中。
-
正如我所说,
In a real-world application such as you describe。如果您一直在选择所有内容,而不是按需选择,那么您的论坛必须发布很少的帖子才能使其表现良好。
标签: sql common-table-expression