Вообще, чем мне не нравится Adjacency List, так это рекурсией, особенно, когда нужно выбрать дерево, без каких либо ограничений, например:
Все дерево комментариев;
Карта сайта;
Навигационное меню;
и т.д.;
Предлагаемые решения формирования массива дерева с помощью указателей, конечно, позволяют избавиться от лишних запросов к базе, но увы не исключают рекурсию, пусть по массиву, но все же. А у нас...
Задача
Сделать один запрос к базе и в один проход собрать одноуровневый список в нужном порядке.
Решение
Как решить такую задачу на уровне базы данных у меня пока идей нет, но на уровне приложения - легко.
Основная сложность состоит в том, что для определенного узла мы можем еще не получить его родителя и детей. Поэтому воспользуемся временными списками и будем их склеивать по мере надобности. Алгоритм предлагаю на Perl.
Пояснения
Изначальная сортировка обязательна только для PID (в обратном порядке) только потому, что список корневых узлов вклеивать в общем-то никуда не надо. Иначе бы пришлось после завершения цикла "доклеить" последний список.
Также я внедрил в алгоритм еще расчет уровня узлов, так как в алгоритме Adjacency List данного поля нет по определению.
Кстати, в хеше %lists кроме списка root останутся списки-артефакты, ни к чему не привязанные.