Если вы действительно хотите это сделать, у вас может быть таблица как
UserVisit: user_id, topic_id, last_visited_at
какую таблицу вы обновляете каждый раз, когда пользователь открывает тему.
Затем вы можете выбрать темы, идентификатор которых отсутствует в этой таблице, или к которым добавлен пост позже, чем last_visited_at. Что-то вроде:
SELECT *
FROM Topic
WHERE Topic.id NOT IN (SELECT topic_id FROM UserVisit WHERE user_id = $user_id)
UNION
SELECT *
FROM Topic
LEFT JOIN UserVisit ON Topic.id = UserVisit.topic_id
WHERE user_id = $user_id
AND UserVisit.last_visited_at < Topic.last_post_at
Но я хотел бы предложить, чтобы вместо этого вы предлагали пользователю только тему с новыми сообщениями с момента последнего посещения сайта пользователем. Если вы сделаете это, вам вообще не понадобится эта таблица, вы можете запросить темы как:
SELECT *
FROM Topic
WHERE Topic.last_post_at > $users_last_visit