データの両方のレイヤーを取得するには、元のコメントの最上位レイヤーの UNION と、可能な返信用の UNION が必要です。クエリの最初の部分の最初の列には、並べ替えのために 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
したがって、すべての行で、2 列目と 3 列目は常に最初のコメントを開始する親 ID を表します...そして、コメント タイプ = 1 の場合、コメント、前回、および終了コメント ID は、コメント開始。コメントタイプ=2の場合、最終コメント、前回、終了コメントがRESPONSEレコードのIDになります。