Эй, ребята, быстрый вопрос. У меня есть таблица сообщений.
Существует два типа сообщений:
Сообщения с тем же идентификатором группы, что и по крайней мере одно другое сообщение - это я хочу объединить вместе, когда они будут представлены. Сгруппированные сообщения - это сообщения с ответами на них. То, что я хочу сделать, - это создать запрос для объединения сгруппированных сообщений в том месте, где раннее/корневое сообщение этой группы будет хронологически относиться к остальным сообщениям независимо от времени, когда будут введены ответы.
мой текущий запрос - это и, очевидно, только сортирует сообщения в хронологическом порядке.
SELECT timestamp,
user,
message,
group_id
FROM messages
WHERE topic_id = ?
ORDER BY timestamp DESC
LIMIT 10
Есть ли у кого-нибудь предложения?
Как насчет этого?
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" в таблице сообщений, вы можете использовать этот столбец для сортировки. Если вам нужно динамически определять, является ли сообщение лидером или последователем, вам нужно работать усерднее.