要获取数据的两层,您将需要原始评论的最顶层的 UNION,以及任何可能的回复的 UNION。查询第一部分的第一列将包含 1 或 2 用于排序目的。这将用于将原始帖子浮动到给定问题的组顶部......然后,所有回复将在此之后按自然顺序显示。
此外,为了保留按原始日期/时间进行的正确分组,我将原始发表评论时间与“2”评论类型记录一起保留,因此它们确实以完全相同的原始时间开始分组,但获取实际评论和时间RESPONSE(别名“r”)用于各自的排序。
select
PreQuery.*
from
( select
'1' as CommentType,
c.Time as OriginalTime,
c.CommentID StartingCommentID,
c.Comment,
c.Time as LastTime,
c.CommentID as EndCommentID
from
comments c
where
c.ParentID = 0
UNION ALL
select
'2' as CommentType,
c.Time as OriginalTime,
c.CommentID StartingCommentID,
r.Comment,
r.Time as LastTime,
r.CommentID as EndCommentID
from
comments c
join comments r
on c.CommentID = r.ParentID
where
c.ParentID = 0 ) PreQuery
order by
PreQuery.OriginalTime DESC,
PreQuery.StartingCommentID,
PreQuery.CommentType,
PreQuery.LastTime
这应该会给你我认为你正在寻找的结果(稍作修改)
CommentType OriginalTime StartingCommentID Comment LastTime EndCommentID
1 Time3 ID3 Comm3 Time3 ID3 <-- ID 3 IS the start
1 Time2 ID2 Comm2 Time2 ID2 <-- ID 2 is the start of next
2 Time2 ID2 Comm4 Time4 ID4 <- ID4 is reply to orig ID2
2 Time2 ID2 Comm5 Time5 ID5 <- another reply to ID2
1 Time1 ID1 Comm1 Time1 ID1 <-- start of new comment ID1
因此,对于所有行,第 2 列和第 3 列将始终表示开始第一个评论的父 ID...对于评论类型 = 1 的那些,评论、最后一次和结束评论 ID 是来自开始评论。对于comment type = 2,最终评论、最后一次和结束评论将是RESPONSE记录的ID。