Niestety, jeśli nie możesz zmienić modelu danych i używasz MySQL, utknąłeś w sytuacji, w której potrzebujesz zapytań rekurencyjnych i używasz DBMS, który nie obsługuje zapytań rekurencyjnych.
Quassnoi napisał ciekawą serię artykułów na blogu, pokazując techniki wyszukiwania danych hierarchicznych. Jego rozwiązania są dość sprytne, ale bardzo złożone.http:// explainextended.com/2009/03/17/hierarchical-queries-in-mysql/
PostgreSQL to kolejny RDBMS typu open source, który obsługuje zapytania rekurencyjne , więc możesz pobrać całe drzewo przechowywane w sposób, który pokazujesz. Ale jeśli nie możesz zmienić modelu danych, zakładam, że nie możesz przełączyć się na inny RDBMS.
Istnieje kilka alternatywnych modeli danych, które znacznie ułatwiają pobieranie drzew o dowolnej głębokości:
- Tabela zamknięcia
- Zagnieżdżone zestawy, czyli zmodyfikowane przechodzenie przez drzewo zamówień w przedsprzedaży
- Enumeracja ścieżki, czyli zmaterializowana ścieżka
Opisuję je w mojej prezentacji Modele danych hierarchicznych z SQL i PHP oraz w mojej książce Antywzorce SQL:unikanie pułapek programowania baz danych .
Wreszcie, jest inne rozwiązanie, które widziałem w kodzie Slashdot , dla ich hierarchii komentarzy:Przechowują „parent_id” jak na liście sąsiedztwa, ale przechowują również kolumnę „root_id”. Każdy członek danego drzewa ma taką samą wartość dla root_id, który jest najwyższym węzłem przodka w jego drzewie. Wtedy łatwo jest pobrać całe drzewo za pomocą jednego zapytania:
SELECT * FROM site WHERE root_id = 123;
Następnie twoja aplikacja pobiera wszystkie węzły z powrotem z bazy danych do tablicy i musisz napisać kod, aby zapętlić tę tablicę, wstawiając węzły do struktury danych drzewa w pamięci. Jest to dobre rozwiązanie, jeśli masz wiele oddzielnych drzew, a każde drzewo ma stosunkowo mało wpisów. To dobre dla przypadku Slashdota.