Вот один из способов:
SELECT p.*
FROM posts p
LEFT JOIN
(SELECT idPostParent, MAX(dateCreated) AS time_of_newest
FROM posts
GROUP BY idPostParent) p2
ON p.idPostParent = p2.idPostParent
ORDER BY time_of_newest DESC, idPost=p.idPostParent DESC, dateCreated DESC
Пояснение:
Подзапрос
SELECT idPostParent, MAX(dateCreated) AS time_of_newest
FROM posts
GROUP BY idPostParent
выбирает максимальную дату, создаваемую для «нити» (idPostParent
).
Это LEFT JOIN
d для основной таблицы posts
, так что каждый поток имеет time_of_newest
для этого потока.
Мы сортируем по time_of_newest
DESCENDING (это ставит нить 2 перед нитью 1 перед нитью 4).
Затем мы сортируем по idPost=idPostParent1 DESC
, чтобы получить родительские посты перед ответами (родительские посты имеют здесь 1, а все ответы имеют 0, и, поскольку мы сортируем по убыванию родительские посты, идут первыми).
Наконец, мы сортируем по dateCreated DESC
, чтобы получить ответы по порядку.