To zależy od rzeczywistej implementacji Twojej hierarchii w bazie danych. Jeśli używasz modelu zestawów zagnieżdżonych ( http://mikehillyer.com/articles/managing-hierarchical-data- w-mysql/ ) możesz pobrać pełną ścieżkę rodzic-dziecko za pomocą jednego wyboru.
Aktualizacja :Ok, ponieważ masz zamiar korzystać z modelu listy sąsiedztwa, sugeruję przechowywanie poziomu węzłów w tabeli. Nie tylko poda głębokość węzła w jednym zapytaniu, ale także pozwoli Ci pobrać całą ścieżkę do tego węzła w jednym zapytaniu (choć to zapytanie musiałoby być generowane dynamicznie):
SELECT n1.name AS lvl1, n2.name as lvl2, n3.name as lvl3, ..., nN.name as lvlN
FROM nodes AS n1
JOIN nodes AS n2 ON n2.parent_id = n1.id
JOIN nodes AS n3 ON n3.parent_id = n2.id
...
JOIN nodes AS nN ON nN.parent_id = n(N-1).id
WHERE nN.id = myChildNode;
Ponieważ wiesz, że Twój węzeł jest na poziomie N, nie ma potrzeby lewych złączeń, a biorąc pod uwagę odpowiednie indeksy w id / parent_id, powinno to być dość szybkie.
Wadą tego podejścia jest to, że będziesz musiał zachować poziom węzła aktualizowane podczas przenoszenia węzła, ale powinno to być dość proste i szybkie, ponieważ robisz to tylko dla samego węzła i jego dzieci – nie dla większości tabeli, jak w przypadku zestawów zagnieżdżonych.