Antwort #10 am: 17. November 2010, 11:59:16
Hallo Thomas,
zu der Frage alle Artikel einer Kategorie und deren Unterkategorien:
die Menge der Artikel (ich hab das mal nur für 3 Ebenen gemacht) kriegst Du z.B. so:
SELECT DISTINCT p2c.products_id
FROM products_to_categories p2c
JOIN categories c ON c.categories_id = p2c.categories_id
JOIN
(SELECT cd.categories_id id1, c.categories_id id2, c2.categories_id id3
FROM categories_description cd
LEFT JOIN categories c ON c.parent_id = cd.categories_id
LEFT JOIN categories c2 ON c2.parent_id = c.categories_id
WHERE cd.categories_name = '<Name der obersten Kategorie>') x
ON c.categories_id = x.id1 OR c.categories_id = x.id2 OR c.categories_id = x.id3
Im inneren select (x) holst Du Dir nur die Kategorien - die Unterkategorien hängen über parent_id an der nächsthöheren. Jede Ebene gibt ihre ids in einem eigenen Feld raus. Das äußere select ermittelt die Artikel zu den Kategorien.
Dieser Riegel kann dann im where part des update-statements benutzt werden:
UPDATE products
SET products_nobuy = 1
WHERE products_id IN
(SELECT DISTINCT p2c.products_id
FROM products_to_categories p2c
JOIN categories c ON c.categories_id = p2c.categories_id
JOIN
(SELECT cd.categories_id id1, c.categories_id id2, c2.categories_id id3
FROM categories_description cd
LEFT JOIN categories c ON c.parent_id = cd.categories_id
LEFT JOIN categories c2 ON c2.parent_id = c.categories_id
WHERE cd.categories_name = '<Name der obersten Kategorie>') x
ON c.categories_id = x.id1 OR c.categories_id = x.id2 OR c.categories_id = x.id3)
Es gibt mehrere Möglichkeiten, die Menge zu ermitteln, unions würden z.B. auch gehen.
Da MySQL keine rekursiven Abfragen kennt, kann man das kaum knackiger formulieren.
Grüße, Volker