要获取这两个数据层,您只需要一个UNION即原始注释的最顶层,另一个用于任何POSSIBLE回复。查询的第一部分的第一列将保留1或2用于排序目的。这将用于将原始帖子浮动到给定问题的组顶部......然后,所有回复将在那之后以自然顺序显示。
此外,为保留原始日期/时间的正确分组,我使用'2'CommentType记录保留原始发表评论时间,以便它们保持按照完全相同的原始时间开始基准分组,但抓住实际评论和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
所以,对于所有行,第二和第三列将始终代表正在启动父ID第一条评论......对于评论类型= 1的评论,评论,上次评论和最终评论ID是开始评论的实际内容。对于评论类型= 2,最终评论,上次评论和结束评论将是RESPONSE记录的ID。
线程是如何设置的?它与纪念相同吗?如果我理解正确,它会输出原始线程。我试图模仿disqus,livefyre的评论时间递减,但回复显示在他们回复的评论下方。缩进只是一个格式问题,所以我只需要在各自的父注释下插入回复。 – user1260310
线程可能不是最好的单词,但它在select子句中由条件设置。因此,如果parent_id为空,我们将使用纪念的线程ID。这只是为了整理所有评论。 – Gohn67
为了澄清,线程不是真正的列,它只是if函数的别名。我们使用线程在这里作弊,因为我们假设线程按从最旧到最新的顺序输入,然后每个分组注释都按时间列排序。 – Gohn67