Nested Set mit LEFT JOIN

Nested Set mit LEFT JOIN

am 18.08.2007 03:54:00 von Peter Mairhofer

Hi!

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

Re: Nested Set mit LEFT JOIN

am 18.08.2007 09:36:02 von B.Steinbrink

On Sat, 18 Aug 2007 01:54:00 +0000, Peter Mairhofer wrote:

> 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
[...]
> LEFT JOIN ts_products_categories AS pc ON pc.categoryID =
> node.categoryID [...]
>
> #1054 - Unknown column 'node.categoryID' in 'on clause'

Komma-Syntax... In der Mischung wird zuerst dein LEFT JOIN ausgeführt und
zwar gegen das Subquery. Und da gibt es wirklich kein node.categoryID,
nur subtree.categoryID. Ersetz die Kommas durch JOINs und es sollte
funktionieren.

Siehe: http://dev.mysql.com/doc/refman/5.0/en/join.html

Irgendwo in der langen Liste "Join Processing Changes in MySQL 5.0.12"

Björn