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:
-
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.
-
Verwenden Sie einen der Algorithmen zum Speichern von Baumdaten in einer relationalen Datenbank. Einer dieser Algorithmen heißt
Modified Preorder Tree Traversaloder 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:
-
Übergeordnete Kategorieinformationen nach ID abrufen:
SELECT lft,rgt FROM tbl_categories WHERE categoryId=5Nehmen wir als Beispiel an, dass die übergeordnete Kategorielft=7hatte undrgt=10(in diesem Fall hat es bereits ein Kind) -
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 DESCUPDATE 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.
-
Legen Sie
lft=<former parent rgt>fest undrgt=<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.