SELECT /* whatever */
FROM threads t
JOIN users tu ON t.poster = tu.id
JOIN posts p ON t.id = p.thread_id
JOIN users pu ON p.poster = u.id
В принципе, если я вас правильно понимаю, вам просто нужно присоединиться к пользователям дважды, один раз из тем и один раз из сообщений.
Почему различие между темами и сообщениями кстати? Это модельное решение может привести к некоторой неловкости, подобной приведенной выше.
Для такого рода вещей я предпочитаю подход список смежности : у каждого поста есть родитель (пост, на который кто-то ответил), если только вы не выполняете настоящую ветку, а это просто список посты, как на типичном форуме.
Таким образом, темы - это просто сообщения, у которых нет родителей.
То, что вы делаете, может работать, но это может быть неудобно, когда вы попадаете в список, включающий перечисление всех сообщений (включая те, которые создали тему), которые сделал пользователь. Внезапно вы должны начать объединять столы вместе и так далее.