Przy 3 poziomach kategorii zapytanie wygląda tak
<?php SELECT DISTINCT * FROM products_2_categories p_2_c, products p left join promocja pro on (pro.promocja_produkt_id = p.product_id) WHERE p_2_c.product_id = p.product_id AND (p_2_c.category_id in (SELECT category_id FROM categories WHERE category_parent_id = $category_id UNION SELECT category_id FROM categories WHERE category_parent_id in (SELECT category_id FROM categories WHERE category_parent_id = $category_id)) or p_2_c.category_id = $category_id ) " ?>
Jeszcze bardziej się to komplikuje przy 4 poziomowej strukturze kategorii, jak macie to u siebie rozwiązane.
Wpadłem tez na pomysł aby funkcją rekurencyjną pobierać najpierw id wszystkich produktów z wszystkich pod kategori do tablicy, a potem
<?php ... WHERE p_2_c.product in ($array) ?>
Ale chyba te rozwiązanie bedzie mniej wydajne niż te wyżej? Ponieważ przy tym rozwiązaniu wyżej nie używam wogóle php do zapytania.