Няма единична 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 DESC
UPDATE 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
. Има доста уроци по тази тема.