Как насчет этого?
SELECT m.timestamp, m.user, m.message, m.group_id, g.grp_timestamp
FROM messages AS m JOIN
(SELECT group_id, MIN(timestamp) AS grp_timestamp
FROM messages
GROUP BY group_id) AS g ON m.group_id = g.group_id
WHERE m.topic_id = ?
ORDER BY g.grp_timestamp, g.group_id, m.timestamp;
Логика идентифицировать ранние метки времени для каждого group_id в суб-запроса (предполагая сообщения без каких-либо ответов имеет действительный group_id присвоенных), а затем сортировать первую групповым метку времени, затем идентификатор группы (так что если две группы в конечном итоге имеют одну и ту же временную метку, сообщения все равно отсортированы правильно), а затем по метке времени сообщения.
Возможно, вы захотите нажать предложение WHERE в подвыборку.
Если вы хотите, самые последние сообщения в первую очередь, то в принципе, вы подаете заявление DESC в ORDER BY пункта в соответствующих местах.
SELECT m.timestamp, m.user, m.message, m.group_id, g.grp_timestamp
FROM messages AS m JOIN
(SELECT group_id, MIN(timestamp) AS grp_timestamp
FROM messages
GROUP BY group_id) AS g ON m.group_id = g.group_id
WHERE m.topic_id = ?
ORDER BY g.grp_timestamp DESC, g.group_id, m.timestamp DESC;
Возможно, вам захочется, чтобы группа с последним ответом показалась первой; в этом случае, вам нужно настроить агрегат от MIN до MAX:
SELECT m.timestamp, m.user, m.message, m.group_id, g.grp_timestamp
FROM messages AS m JOIN
(SELECT group_id, MAX(timestamp) AS grp_timestamp
FROM messages
GROUP BY group_id) AS g ON m.group_id = g.group_id
WHERE m.topic_id = ?
ORDER BY g.grp_timestamp DESC, g.group_id, m.timestamp;
Пока вы все в порядке с ответами появляются в хронологическом порядке, я думаю, что делает трюк. Если ответы должны отображаться в обратном хронологическом порядке с исходным сообщением, появляющимся первым, у вас есть некоторые трудности. Если вы отметили сообщения «L» для «leader» и «F» для «follower» в таблице сообщений, вы можете использовать этот столбец для сортировки. Если вам нужно динамически определять, является ли сообщение лидером или последователем, вам нужно работать усерднее.
MySQL не имеет поддержки иерархического/рекурсивного запроса –
, так как, например, как сайт, например reddit или youtube, будет отвечать на группировку ответов, должен быть способ сделать это с помощью mysql ... может быть, не так, как я предложил Я должен попробовать – Scarface