Comment récupérer les catégories enfants sans les enfants de celles-ci?
-
22-07-2019 - |
Question
Voici ma déclaration:
SELECT (
COUNT( parent.categoryName ) - ( sub_tree.depth +1 ) ) AS depth,
CONCAT( REPEAT( '', ( COUNT( parent.categoryName ) - ( sub_tree.depth +1 ) ) ) , node.categoryName ) AS categoryName
FROM
Categories AS node,
Categories AS parent,
Categories AS sub_parent,
(
SELECT node.categoryName, (
COUNT( parent.categoryName ) -1) AS depth
FROM
Categories AS node,
Categories AS parent
WHERE
node.categoryLft BETWEEN parent.categoryLft AND parent.categoryRgt
AND node.categoryName LIKE 'Product'
GROUP BY node.categoryName
ORDER BY node.categoryLft
) AS sub_tree
WHERE
node.categoryLft BETWEEN parent.categoryLft AND parent.categoryRgt
AND node.categoryLft BETWEEN sub_parent.categoryLft AND sub_parent.categoryRgt
AND sub_parent.categoryName = sub_tree.categoryName
GROUP BY node.categoryName
ORDER BY node.categoryLft
Cela fonctionne très bien, mais j'aurais aimé le modifier pour obtenir uniquement les premiers nœuds à côté de la catégorie sélectionnée (ici "Produits") sans les enfants des sous-catégories
J'aime: Produits:
-
TypeA
-
sous-typeA
-
sous-type B
-
-
TypeB
Je veux obtenir 'TypeA', 'TypeB'.
Au fait, voici mon tableau:
CREATE TABLE `Categories` (
`categoryId` int(11) NOT NULL auto_increment,
`categoryLft` int(11) NOT NULL,
`categoryRgt` int(11) NOT NULL,
`categoryName` varchar(255) default NULL,
`categoryAlias` varchar(255) default NULL,
PRIMARY KEY (`categoryId`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
La solution
SELECT child.*
FROM categories parent
JOIN categories child
ON child.categoryLft BETWEEN parent.categoryLft AND parent.categoryRgt
WHERE parent.id = @id_of_products
AND NOT EXISTS
(
SELECT NULL
FROM categories grandchild
WHERE grandchild.categoryLft BETWEEN child.categoryLft AND child.categoryRgt
)
Le modèle Ensembles imbriqués
que vous utilisez est très difficile à gérer.
Vous voudrez peut-être lire cet article dans mon blog:
qui décrit comment implémenter un modèle beaucoup plus simple de liste de contiguïté
dans MySQL
.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow