Я столкнулся с той же проблемой, только я шел только на одну глубину.
--Comment (depth: 0)
---Reply (depth: 1)
Мне удалось использовать один запрос для выбора всех этих записей, при этом ограничение верхнего уровня Comment
записей только 10.
SELECT c.* FROM comments AS c WHERE c.OwnerId = 1 AND c.ParentId = 0 LIMIT 10
UNION
SELECT cc.* FROM comments AS cc
INNER JOIN
(
SELECT CommentId FROM comments WHERE OwnerId = 1 AND ParentId = 0 LIMIT 10
)
AS c2
ON cc.ParentId = c2.CommentId
Этот запрос в основном выполняет следующие действия:
- Получает первые 10 записей, которые являются комментариями верхнего уровня и имеют
идентификатор конкретного владельца.
- Получает все комментарии, у которых родительский идентификатор равен идентификатору комментария, который
был возвращен первым запросом и объединяет их в набор результатов.
Хотя я думаю, что этот запрос был бы более эффективным, чем многократные обращения к базе данных для каждой записи, у него все еще есть недостаток: он выполняет первый запрос дважды. Один раз перед объединением и один в объединении.
Кажется, это довольно быстро, но не так быстро, как хотелось бы. Однако, если ваша база данных удаленная и задержка является проблемой, это решение может помочь вам лучше, чем делать несколько удаленных запросов к базе данных.