Ceci est ma table:Comment puis-je trouver tous les frères et soeurs de mon nœud et de ses ancêtres dans une arborescence de catégories hiérarchique?
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;
J'ai une URL qui ressemble à ceci: products.php?category=5
de l'ID de la catégorie que je dois récupérer toutes les catégories avec le même parent à chaque niveau de la hiérarchie. J'ai trouvé un moyen de le faire mais je pense que c'est inefficace, y a-t-il une meilleure façon de le faire?
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
Par exemple, disons que mon arbre de catégorie ressemble à ceci:
http://dev.mysql.com/tech-resources/articles/hierarchical-data-1.png
(de Managing Hierarchical Data in MySQL)
Disons que l'utilisateur a sélectionné « lecteurs cd », je veux récupérer le Information suivante:
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
Je veux récupérer toutes les catégories sélectionnées Toutes les catégories qui se trouvent au même niveau que les catégories sélectionnées ainsi que les informations de profondeur et les catégories sélectionnées.
La raison pour laquelle je dois faire ceci est que la page des produits puisse inclure un menu de navigation déroulant pour chaque niveau de catégorie jusqu'à la catégorie sélectionnée.
Merci, c'est ce dont j'avais besoin. –
Les informations de profondeur semblaient être incorrectes jusqu'à ce que j'ajoute DISTINCT: COUNT (DISTINCT c.CategoryId) AS profondeur –
Merci, je n'ai pas testé la requête. J'ai modifié pour inclure ce correctif. –