forums:
id | key | title
topics:
id | forum | title | user | date
posts:
id | topic | content | user | date
То есть технически топик не имеет содержания, только заголовок — в качестве содержания используются посты, и текст топика записывается как первый пост в этом топике.
Нужно выбрать непрочитанные топики, на практике — непрочитанные посты и, в связи с ними, топики.
Для этого использую таблицу прочитанных постов. При прочтении темы, посты из нее заносятся в эту таблицу:
id | user | post
В итоге задача состоит в том, что нужно выбрать посты, которых для данного юзера нет в таблице прочтенных, и по ним вытянуть остальные данные.
Запрос выглядит так:
SELECT TT . * , TP.`content` AS `last_answer` , count( TP.`id` ) AS `answers` , TF.`key` AS `forum_key`
FROM `topics` AS TT
JOIN `posts` AS TP ON TT.`id` = TP.`topic`
JOIN `forums` AS TF ON TF.`id` = TT.`forum`
WHERE TP.`id` NOT
IN (
SELECT TR.`post`
FROM `posts_read` AS TR
WHERE TR.`user` = "1"
)
GROUP BY TT.`id`
ORDER BY TP.`date` DESC
Но — в `last_answer` оказывается первый пост из топика, а мне нужен последний. Где я туплю?