Dalle modifiche e dal feedback sui commenti, ecco la query che penso tu stia cercando... La prequery più interiore riceve i post e chi ha avviato il post, i commenti e chi ha pubblicato i commenti. Questa query interna è anche preordinata con i COMMENTI PIÙ RECENTI all'inizio per ID post. Usando il risultato di ciò, mi unisco alle variabili sql (@variables) per ottenere @varRow aumentato ogni volta che un nuovo commento e ripristinato a 1 ogni volta che un ID post cambia (da qui gli ordini PreQuery interni per ID post PRIMA ). Infine, utilizzando la clausola HAVING per fare in modo che il conteggio di @varRow <6 del commento raggiunga MASSIMO 5 di ogni post.
Se vuoi limitare i post che stai cercando di recuperare, applicherei una clausola WHERE (come data/ora se disponibile) al massimo INNER che genera la "Prequery".
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
--- EDIT --- per commentoPenso che cosa intendi con "Post principale" a cui sono associati i commenti è perché hanno direttamente l'ID del post. Poiché la query più interna esegue un join di tutti gli elementi/tabelle su tutta la linea, tutti stanno arrivando per il giro...
Post -> User (to get posting user name )
Post -> Comment (on Common Post ID -- left joined)
Comment -> User ( to get commenting user name)
Una volta che QUELLO è stato eseguito e ordinato in base all'ID post comune e al commento più recente ordinato in alto, applico @vars a TUTTE le righe restituite. La clausola HAVING eliminerà qualsiasi commento la cui sequenza è OLTRE i 5 che stavi cercando.