Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Abfrage, die den Kategoriebaum zurückgibt

Es gibt keine einzelne SQL-Abfrage das kann Ihnen Ergebnisse liefern, die auf der Grundlage dieser Tabellenstruktur so geordnet sind, wie Sie es erwarten.

Es gibt zwei Möglichkeiten, das Problem zu lösen:

  1. Verwenden Sie externe Anwendungslogik (außerhalb von DB), um rekursive Aufrufe durchzuführen, die untergeordnete Elemente jeder Kategorie entdecken und den Baum in der Anwendung erstellen.

  2. Verwenden Sie einen der Algorithmen zum Speichern von Baumdaten in einer relationalen Datenbank. Einer dieser Algorithmen heißt Modified Preorder Tree Traversal oder einfach MPTT.

Angenommen, wir verwenden die Spalten lft und rgt Um Links-/Rechts-Indizes beim Durchlaufen beizubehalten, müssen Sie beim Einfügen einer neuen Kategorie:

  1. Übergeordnete Kategorieinformationen nach ID abrufen:SELECT lft,rgt FROM tbl_categories WHERE categoryId=5 Nehmen wir als Beispiel an, dass die übergeordnete Kategorie lft=7 hatte und rgt=10 (in diesem Fall hat es bereits ein Kind)

  2. Platz für einen neuen Eintrag schaffen - alle Datensätze um 2 verschieben (1 für lft und 1 für 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

Notieren Sie hier ORDER absteigend. Als lft und rgt einzigartig sein sollen, wird empfohlen, einen UNIQUE zu machen Einschränkung für sie, und dann ist eine absteigende Reihenfolge in der Aktualisierung erforderlich, um doppelte Schlüsselfehler zu vermeiden.

  1. Legen Sie lft=<former parent rgt> fest und rgt=<former parent rgt +1> und einen neuen Datensatz einfügen...

    INSERT INTO tbl_categories SET categoryName="New Child",parentCategoryId=5,lft=11,rgt=12,...

Ausführlichere Beispiele mit Code finden Sie, wenn Sie nach MPTT PHP MySQL suchen . Es gibt einige Tutorials zu diesem Thema.