【发布时间】:2019-04-16 13:21:04
【问题描述】:
这是我的桌子:
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;
我有一个如下所示的网址:products.php?category=5
从类别 ID 中,我需要在层次结构的每个级别检索具有相同父级的所有类别。我找到了一种方法来做到这一点,但我认为它效率低下,有没有更好的方法来做到这一点?
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
例如,假设我的类别树如下所示:
(来自Managing Hierarchical Data in MySQL)
假设用户选择了“cd 播放器”,我想检索以下信息:
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
我想检索所有选定的类别和与选定类别处于同一级别的所有类别以及深度信息和选定的类别。
我需要这样做的原因是,产品页面可以包含一个下拉导航菜单,用于每个级别的类别,一直到所选类别。
【问题讨论】: