Die KategorienIDs und ArtikelIDs kann man zb auch hiermit rausfischen, im Beispiel bis 4 Ebenen tief, aber einfach erweiterbar. Wurzelkategorie ist 4711.
SELECT p2c.products_id, p2c.categories_id
FROM products_to_categories p2c
JOIN
(SELECT concat_ws(',', c4.categories_id, c3.categories_id, c2.categories_id, c.categories_id) str
FROM categories c
LEFT JOIN categories c2 ON c.categories_id = c2.parent_id
LEFT JOIN categories c3 ON c2.categories_id = c3.parent_id
LEFT JOIN categories c4 ON c3.categories_id = c4.parent_id
WHERE c.categories_id = 4711) s ON concat(',', s.str, ',') LIKE concat('%,', p2c.categories_id, ',%')
Dann dieses select in zwei update statements einsetzen, zb so:
-- Artikel abschalten
UPDATE products
SET products_status = 0
WHERE products_id IN
(/* das select statement von oben, ohne die categories_id im select-part */)
-- Kategorien abschalten
UPDATE categories
SET categories_status = 0
WHERE categories_id IN
-- das select statement von oben, distinct, ohne die products_id im select-part:
(SELECT DISTINCT p2c.categories_id
FROM products_to_categories p2c
JOIN
(SELECT concat_ws(',', c4.categories_id, c3.categories_id, c2.categories_id, c.categories_id) str
FROM categories c
LEFT JOIN categories c2 ON c.categories_id = c2.parent_id
LEFT JOIN categories c3 ON c2.categories_id = c3.parent_id
LEFT JOIN categories c4 ON c3.categories_id = c4.parent_id
WHERE c.categories_id = 4711) s ON concat(',', s.str, ',') LIKE concat('%,', p2c.categories_id, ',%'))
Zum Anschalten den Status jeweils auf 1 statt auf 0 updaten. Keine Schleife, sondern nur 2 update statements. Und wenn nur die Kategorien (de)aktiviert werden sollen, nur das Kategorien-update statement. Wofür hat man denn seine Datenbank?
Grüße, Volker