編集とコメントのフィードバックから、これがあなたが探していると思うクエリです...最も内側のprequeryは投稿を取得し、誰が投稿を開始したか、コメント、誰がコメントを投稿したかを示します。この内部クエリも、postIDごとに最上位のMOSTRECENTCOMMENTSで事前に並べ替えられています。その結果を使用して、SQL変数(@variables)に参加し、新しいコメントのたびに@varRowを増やし、投稿IDが変更されるたびに1にリセットします(したがって、内部のPreQueryは投稿IDFIRSTで順序付けます)。最後に、HAVING句を使用してコメントの@varRow count <6を設定すると、各投稿のMOST5に到達します。
取得しようとしている投稿を制限したい場合は、「PreQuery」を生成する最も内側のINNERにWHERE句(利用可能な場合は日付/時刻など)を適用します。
select straight_join
PreQuery.*,
@varRow := if( @LastPost = PreQuery.PostID, @varRow +1, 1 ) CommentRow,
@LastPost := PreQuery.PostID PostID2
from
( select
posts.id PostID,
posts.body,
posts.CreatedAt,
u1.id UserID,
u1.DisplayName NameOfPoster,
c.id,
c.userid CommentUserID,
c.text CommentText,
u2.DisplayName CommentUserName
from
posts
join users u1
on posts.ownerUserID = u1.id
LEFT JOIN comments c
on posts.id = c.PostID
join users u2
on c.userid = u2.id
where
posts.id = TheOneParentIDYouWant
OR posts.parentid = TheOneParentIDYouWant
order by
posts.ID,
c.id desc ) PreQuery,
(select @varRow := 0, @LastPost = 0 ) SQLVars
having
CommentRow < 6
order by
PreQuery.postid,
CommentRow
---編集---コメントごとにコメントが関連付けられている「親の投稿」の意味は、投稿IDが直接あるためだと思います。最も内側のクエリは、すべての要素/テーブルを全面的に結合するため、すべてが乗り物に乗っています...
Post -> User (to get posting user name )
Post -> Comment (on Common Post ID -- left joined)
Comment -> User ( to get commenting user name)
それがすべて完了し、共通の投稿IDで並べ替えられ、最新のコメントが一番上に並べ替えられたら、返されたすべての行に対して@varsを適用します。 HAVING句は、シーケンスが探していた5を超えているコメントをすべて削除します。