Nested Set mit LEFT JOIN
am 18.08.2007 03:54:00 von Peter MairhoferHi!
Eine Kategorienliste (die baumfoermig aufgebaut ist) habe ich mit Nested
Sets implementiert (Tabelle th_categories). Dank Daniel F. hab ich das
ganze nun so hinbekommen dass ich nur eine Ebene bekomme (naemlich die, die
ich gerade angezeigt haben will).
SELECT
node.categoryID,
node.category,
node.rewrite_text,
(COUNT(parent.categoryID) - (subtree.depth + 1)) AS depth,
COUNT(parent.categoryID) - 1 AS level
FROM th_categories AS node,
th_categories AS parent,
th_categories AS subparent,
( SELECT node.categoryID, (COUNT(parent.categoryID) - 1) AS depth
FROM th_categories AS node, th_categories AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.categoryID = $__CATEGORYID_DES_VATERS__
GROUP BY node.categoryID ORDER BY node.lft
) AS subtree
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.lft BETWEEN subparent.lft AND subparent.rgt
AND subparent.categoryID = subtree.categoryID
GROUP BY node.categoryID
HAVING depth = 1
ORDER BY node.lft
Das funktioniert gut.
Nun sind jeder Kategorie natuerlich Produkte zugeordnet. Die Verknuefung
befindet sich in der Tabelle ts_products_categories:
prod_catID int(11) NO PRI NULL auto_increment
productID int(11) NO 0
categoryID int(11) NO 0
Jetzt wuerde ich gerne bei der obigen Abfrage die Anzahl der Produkte
ausgeben, die innerhalb einer Kategorie sind.
Nun scheitere ich aber bereits daran die ts_products_categories damit zu
verknuepfen! Mache ich ein LEFT JOIN, so sagt mySQL dass angeblich
categoryID nicht existiert (fuer mich nicht nachvollziebar, denn beim
SELECT Statement gib ichs ja mit aus!):
[...]
LEFT JOIN ts_products_categories AS pc ON pc.categoryID = node.categoryID
[...]
#1054 - Unknown column 'node.categoryID' in 'on clause'
Haenge ich die Tabelle einfach beim SELECT dazu bekomme ich gleich gar
keine Ausgabe mehr :-(
Laesst sich die Aufgabenstellung erfuellen? Und wenn ja, wie?
Mit der Zeit wirds dann mit den GROUP BYs auch etwas unuebersichtlich...
Vielen Dank im Vorraus!
LG,
Peter