Wie die Kinder Kategorien ohne die Kinder dieser diejenigen zurückzuholen?
-
22-07-2019 - |
Frage
Hier ist meine Aussage:
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
Es funktioniert großartig, aber ich hätte mir gewünscht, ihn zu ändern, nur die ersten Knoten erhalten neben der ausgewählten Kategorie (hier ‚Produkte‘), ohne dass die Kinder der Unterkategorien
Wie: Produkte:
-
TypeA
-
SubTypeA
-
SubTypeB
-
-
TypeB
Ich will get 'TypeA', 'TypeB'.
By the way, hier ist meine Tabelle:
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
Lösung
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
)
Nested sets
Modell Sie verwenden, ist sehr schwer zu verwalten.
Sie möchten diese Artikel in meinem Blog lesen:
, die beschreibt, wie ein viel einfachere adjacency list
Modell in MySQL
implementieren.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow