Во-первых, я не вижу в вашей схеме ничего, что связывало бы сообщения с темами.Мой ответ предполагает, что в posts
есть дополнительный столбец с именем threadid
.
. Наиболее распространенное решение этой проблемы, которое я видел, - это отслеживание идентификатора (и, возможно, идентификатора пользователя и имени пользователя)самый последний пост в таблице threads
.Получить самую последнюю запись легко, если все, что вам нужно, это идентификатор:
SELECT threadid, MAX(id) FROM posts WHERE <...> GROUP BY threadid
Но эффективного способа получить связанное время или идентификатор пользователя из этого запроса не существует.Самое близкое, что я могу получить, это беспорядок:
SELECT threadid, id, user, username, thedate FROM posts
WHERE posts.id IN (
SELECT threadid, MAX(id) FROM posts WHERE <...> GROUP BY threadid
)
, что невероятно неэффективно для MySQL - оптимизатор полностью разваливается на подзапросах с GROUP BY
.(Запрос занимает около 300 мс в тестовой базе данных с менее чем сотней потоков.) Просто прикусите язык, денормализуйте базу данных, сохранив информацию о самой последней записи в потоке, и все будет в порядке.