Няма единична SQL заявка които могат да ви донесат резултати, подредени по начина, който очаквате въз основа на тази структура на таблицата.
Има два начина за решаване на проблема:
-
Използвайте външна логика на приложението (извън DB), за да извършвате рекурсивни извиквания, които ще открият дъщерни елементи от всяка категория и ще изградят дървото в приложението.
-
Използвайте един от алгоритмите за съхраняване на дървовидни данни в релационна база данни. Един от тези алгоритми се нарича
Modified Preorder Tree Traversalили просто MPTT.
Ако приемем, че използваме колони lft и rgt за да поддържате леви/десни индекси при преминаване, когато вмъкнете нова категория, ще трябва да:
-
Получете информация за родителската категория по идентификатор:
SELECT lft,rgt FROM tbl_categories WHERE categoryId=5Да предположим за пример, че родителската категория е ималаlft=7иrgt=10(в този случай вече има едно дете) -
Направете място за нов запис - преместете всички записи с 2 (1 за lft и 1 за rgt):
UPDATE tbl_categories SET rgt=rgt+2 WHERE rgt>=10 ORDER BY rgt DESCUPDATE tbl_categories SET lft=lft+2 WHERE lft>=10 ORDER BY lft DESC
Забележете тук ORDER низходящо. Като lft и rgt се предполага, че са уникални, препоръчително е да направите UNIQUE ограничение върху тях, а след това е необходим низходящ ред в актуализацията, за да се предотвратят дублиращи се ключови грешки.
-
Задайте
lft=<former parent rgt>иrgt=<former parent rgt +1>и поставете нов запис...INSERT INTO tbl_categories SET categoryName="New Child",parentCategoryId=5,lft=11,rgt=12,...
Можете да намерите по-подробни примери с код, ако потърсите MPTT PHP MySQL . Има доста уроци по тази тема.