Сам форум будет состоять из
HTML-таблица со следующими заголовками:
Topic | Last Post | Replies
Если «Последнее сообщение» подразумевает дату, это просто.
SELECT
t.id,
t.subject,
MAX(p.date) AS last_post,
COUNT(p.id) AS count_replies
FROM
Topics t
INNER JOIN Posts p ON p.topic_id = t.id
GROUP BY
t.id,
t.subject
Если вы хотите, чтобы другие вещи отображались вместе с последней датой публикации, например, id
или poster
, она становится немного более сложной.
SELECT
t.id,
t.subject,
aggregated.reply_count,
aggregated.distinct_posters,
last_post.id,
last_post.date,
last_post.poster
FROM
Topics t
INNER JOIN (
SELECT topic_id,
MAX(p.date) AS last_date,
COUNT(p.id) AS reply_count,
COUNT(DISTINCT poster) AS distinct_posters
FROM Posts
GROUP BY topic_id
) AS aggregated ON aggregated.topic_id = t.id
INNER JOIN Posts AS last_post ON p.date = aggregated.last_date
В качестве примера я добавил количество отдельных постеров для темы, чтобы показать вам, где этот подход может быть расширен.
Запрос основан на предположении, что никакие два сообщения в одной теме не могут иметь одинаковую дату. Если вы ожидаете, что это произойдет, запрос должен быть изменен, чтобы учесть его.