Neexistuje žádný jediný dotaz SQL které vám mohou přinést výsledky uspořádané tak, jak očekáváte na základě této struktury tabulky.
Problém lze vyřešit dvěma způsoby:
-
Pomocí externí aplikační logiky (mimo DB) provádějte rekurzivní volání, která objeví děti každé kategorie a vytvoří strom v aplikaci.
-
Použijte jeden z algoritmů pro ukládání stromových dat v relační databázi. Jeden z takových algoritmů se nazývá
Modified Preorder Tree Traversal
nebo jednoduše MPTT.
Za předpokladu, že používáme sloupce lft
a rgt
Chcete-li zachovat levý / pravý index v procházení, při vkládání nové kategorie budete muset:
-
Získejte informace o nadřazené kategorii podle ID:
SELECT lft,rgt FROM tbl_categories WHERE categoryId=5
Předpokládejme jako příklad, že nadřazená kategorie mělalft=7
argt=10
(v tomto případě již má jedno dítě) -
Udělejte místo pro nový záznam – posuňte všechny záznamy o 2 (1 pro lft a 1 pro 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
Poznámka:ORDER
klesající. Jako lft
a rgt
mají být jedinečné, doporučuje se vytvořit UNIQUE
omezení na ně a pak je potřeba sestupné pořadí aktualizace, aby se zabránilo duplicitním chybám klíčů.
-
Nastavte
lft=<former parent rgt>
argt=<former parent rgt +1>
a vložte nový záznam...INSERT INTO tbl_categories SET categoryName="New Child",parentCategoryId=5,lft=11,rgt=12,...
Podrobnější příklady s kódem naleznete, pokud vyhledáte MPTT PHP MySQL
. Na toto téma existuje poměrně dost tutoriálů.