sql >> Databáze >  >> RDS >> Mysql

Mysql dotaz, který vrací strom kategorií

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:

  1. 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.

  2. 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:

  1. 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ěla lft=7 a rgt=10 (v tomto případě již má jedno dítě)

  2. 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íčů.

  1. Nastavte lft=<former parent rgt> a rgt=<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ů.



  1. Příklady MAKEDATE() – MySQL

  2. MySQL select se zdá být velmi pomalý, ale nenapadá vás, jak to zlepšit?

  3. mysql replikace - slave server na jedné databázi

  4. Hromadné vložení serveru SQL – část 1