За съжаление, ако не можете да промените модела на данни и използвате MySQL, вие сте заседнали в ситуация, в която имате нужда от рекурсивни заявки и използвате СУБД, която не поддържа рекурсивни заявки.
Quassnoi написа интересна серия от статии в блогове, показващи техники за запитване на йерархични данни. Решенията му са доста умни, но много сложни.http:// objasniextended.com/2009/03/17/hierarchical-queries-in-mysql/
PostgreSQL е друга RDBMS с отворен код, която поддържа рекурсивни заявки , така че можете да извлечете цяло дърво, съхранено по начина, който показвате. Но ако не можете да промените модела на данни, предполагам, че не можете да превключите към друга RDBMS.
Има няколко алтернативни модела на данни, които правят много по-лесно извличането на произволно дълбоки дървета:
- Таблица за затваряне
- Вложени набори, известни още като модифицирано обхождане на дървото за предварителна поръчка
- Изброяване на пътя, известен още като материализиран път
Разглеждам ги в презентацията си Модели за йерархични данни с SQL и PHP , и в моята книга SQL Antipatterns:Избягване на клопките на програмирането на бази данни .
И накрая, има друго решение, което съм виждал използвано в кода за Slashdot , за техните йерархии на коментарите:Те съхраняват "parent_id" като в списъка на съседство, но също така съхраняват колона "root_id". Всеки член на дадено дърво има една и съща стойност за root_id, който е най-високият възел-предшественик в неговото дърво. Тогава е лесно да извлечете цяло дърво с една заявка:
SELECT * FROM site WHERE root_id = 123;
След това вашето приложение извлича всички възли обратно от базата данни в масив и вие трябва да напишете кода, за да обиколите този масив, като вмъкнете възлите в дървовидна структура от данни в паметта. Това е добро решение, ако имате много отделни дървета и всяко дърво има сравнително малко записи. Това е добре за случая на Slashdot.