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 Traversalnebo 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=5Předpokládejme jako příklad, že nadřazená kategorie mělalft=7argt=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 DESCUPDATE 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ů.