Хороший способ получить все узлы для данного дерева при использовании списка смежности - добавить столбец в каждую строку с именем root_id
или чем-то еще, чтобы каждый узел знал не только своего непосредственного родителя, но и верхний узел.в своем дереве.
CREATE TABLE Comments (
comment_id INT PRIMARY KEY,
root_id INT,
parent_id INT,
FOREIGN KEY (root_id) REFERENCES Comments (comment_id),
FOREIGN KEY (parent_id) REFERENCES Comments (comment_id)
);
Так что, если у вас иерархия 10 -> 20 -> 30, вы должны хранить следующее:
INSERT INTO Comments SET comment_id = 10, root_id = 10;
INSERT INTO Comments SET comment_id = 20, root_id = 10, parent_id = 10;
INSERT INTO Comments SET comment_id = 30, root_id = 10, parent_id = 20;
Это похоже на то, как Slashdotнапример, хранит деревья комментариев.
Если вы можете написать запрос для выборки всех узлов данного дерева, и каждый узел знает своего непосредственного родителя, в стиле списка смежности для хранения иерархических данных,вы можете преобразовать набор результатов запроса в многомерный массив или дерево объектов при получении.
См. мой ответ на Преобразование плоского массива в многомерный для кода, который делает это вPHP.