Dies ist meine Tabelle:Wie kann ich alle Geschwister zu meinem Knoten und seinen Vorfahren in einem hierarchischen Kategoriebaum finden?
CREATE TABLE IF NOT EXISTS `Category` (
`Name` varchar(25) NOT NULL,
`lft` INT UNSIGNED NOT NULL,
`rgt` INT UNSIGNED NOT NULL,
`CategoryId` int UNSIGNED auto_increment NOT NULL,
PRIMARY KEY (`CategoryId`)
) Engine = InnoDb;
ich eine URL, die wie folgt aussieht: products.php?category=5
Aus der Kategorie-ID ich auf jeder Ebene der Hierarchie alle Kategorien mit den gleichen Eltern abrufen müssen. Ich habe einen Weg gefunden, dies zu tun, aber ich denke, es ist ineffizient, gibt es einen besseren Weg, dies zu tun?
CREATE VIEW category_tree AS
SELECT node.name as name,
node.categoryId as categoryId,
node.lft as lft,
node.rgt as rgt,
(COUNT(parent.categoryId) - 1) AS depth
FROM Category AS node,
Category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.categoryId;
SELECT tree.name, tree.depth, tree.categoryId,
(node.lft BETWEEN tree.lft AND tree.rgt) AS is_selected
FROM category_tree as tree
JOIN category_tree AS node ON node.categoryId = :selectedCategory
JOIN (
SELECT MAX(tree.lft) as lft
FROM category_tree as tree
JOIN category_tree AS node ON node.categoryId = :selectedCategory
WHERE
tree.depth = node.depth -1
AND tree.lft < node.lft
) AS parent_finder
LEFT JOIN category_tree AS parent ON parent.lft = parent_finder.lft
WHERE tree.depth < node.depth
OR (
tree.depth = node.depth
AND tree.lft BETWEEN parent.lft AND parent.rgt
)
OR (
tree.lft BETWEEN node.lft AND node.rgt
AND tree.depth <= node.depth + 1
)
ORDER BY tree.depth, tree.name
Zum Beispiel, sagen wir mal meine Kategoriebaum sieht wie folgt aus:
http://dev.mysql.com/tech-resources/articles/hierarchical-data-1.png
(von Managing Hierarchical Data in MySQL)
Lassen Sie uns sagen, dass der Benutzer „CD-Player“ ausgewählt hat, möchte ich das abrufen folgende Information:
name depth is_selected
electronics 0 1
portable electronics 1 1
televisions 1 0
mp3 players 2 0
cd players 2 1
2 way radios 2 0
Ich möchte alle ausgewählten Kategorien abrufen a nd alle Kategorien, die auf derselben Ebene wie die ausgewählten Kategorien sind, zusammen mit Tiefeninformationen und welche Kategorien ausgewählt sind.
Der Grund, warum ich dies tun muss, ist, dass die Produktseite ein Dropdown-Navigationsmenü für jede Kategorie bis zur ausgewählten Kategorie enthalten kann.
Vielen Dank, das ist, was ich brauchte. –
Die Tiefeninformationen schienen falsch zu sein, bis ich DISTINCT hinzugefügt: COUNT (DISTINCT c.CategoryId) AS Tiefe –
Danke, ich habe die Abfrage nicht getestet. Ich habe diesen Fehler behoben. –