SELECT pt.*, MAX(pc.date) AS latest
FROM post pt
JOIN post pc
ON pc.lft BETWEEN pt.lft AND pt.rgt
WHERE NOT EXISTS
(
SELECT NULL
FROM post pu
WHERE pt.lft BETWEEN pu.lft AND pu.rgt
)
GROUP BY
pt.id
ORDER BY
latest DESC
Вложенные наборы не подходят для выбора уровня глубины, так что это не будет эффективным.
Я бы предложил сохранить начатый поток id
вместе с каждым сообщением и создать составной индексна (starter, date)
.
Таким образом, вы можете просто использовать:
SELECT pt.*,
MAX(date) AS latest
FROM post pu
JOIN post pt
ON pt.id = pu.starter
GROUP BY
pu.starter
ORDER BY
latest DESC
, что будет намного быстрее.