Ответ
Misha v.3 12.11.2008 12:57
если у вас есть только id и parent_id то вариантов собственно всего два:
1. достать всё, и на основании указанного id/parent_id рекурсивно найти всех наследников
2. рекурсивно доставать по одному уровню
какой из этих методов будет быстрее сильно зависит от данных.
например если у вас в дереве 5000 объектов, а средняя глубина 3-5, то скорее всего второй метод будет работать быстрее.
если в дереве всего 100 объектов, то скорее всего быстрее будет работать доставание всего списка объектов.
чтобы ускорить задачи доставания списка наследников существуют разные стратегии, которые подразумевают хранение в дереве доп. информации. этих стратегий не так много (основных вроде 4, плюс небольшие вариации), и все они тут уже обсуждались и ссылки на их подробные описания приводились.
если же вопрос был не про общий подход выбора наследников из БД, а про парсерный алгоритм обхода всех наследников в дереве, то я не вижу глобальных косяков, особенно учитывая тот факт, что всё это уже описано в примерах :)
а по мелочам то:
- я бы символом ',' рулил бы не в cTreePrintItem, а в cTreePrintElementsByParent
- я бы всё таки создал бы локальные переменные для таблиц уровня. глубокие хеш-лукапы в циклах не ускоряют эти самые циклы
- SELECT * я бы в жизни не написал