@goodeb

Как получить все товары, статус родительской категории которых = true?

Как получить все товары при условии, что самая верхняя категория активна(имеет active = true)?
Есть 2 таблицы: категории и товары. Есть дерево категорий: cat>subcat>subsubcat...и т.д.
Пример: sqlfiddle
Основываясь на данном примере результат должен быть 0 т.к Самая верхняя категория 'Cat1' имеет active 'false'
Я пробовал сделать так:
SELECT * FROM shop_products 
INNER JOIN shop_category as sc1 ON (shop_products.category_id=sc1.id)
INNER JOIN shop_category as sc2 ON (sc1.parent_id=sc2.id)
WHERE sc2.active=1

Но это работает только для одного уровно вложенности.
Надеюсь, вопрос понятен. Заранее благодарен.
  • Вопрос задан
  • 103 просмотра
Пригласить эксперта
Ответы на вопрос 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В таком варианте (Adjacency List) только писать хранимую процедуру, так как MySQL не умеет делать рекурсивные запросы. Можно составить запрос для Nested Set, но вам понадобится перевести свою базу на другую модель организации дерева.
PS. Хотя...
Можно просто наделать LEFT JOIN'ов по максимальному уровню вложенности, взять их значения через IFNULL(..., 1) и сделать AND всех полей. Но такой вариант, мягко говоря, так себе.
Ответ написан
Комментировать
@Doc44
Это тормозное решение в принципе.
Реляционные СУБД плохо переживают работу с иерархией.
Тем более, что, надо полагать, у вас разная глубина вложенности.
Если уж вам так хочется именно малоподходящий для конкретно этой задачи MySQL, то я бы предложил битовые маски (полнотекстовый поиск).
Ответ написан
@retvizan
В последних версиях есть рекурсивные ОТВ, в ранних придется эмулировать с помощью ранимой процедуры, см статью с универсальным шаблоном процедуры.
Ответ написан
Arris
@Arris
Сапиенсы учатся, играя.
Никита, денормализовать таблицу, для каждого товара (скриптом) посчитать значение нужного родителя и ориентироваться на это значение?

P.S. Не всегда денормализация таблицы - грех и ересь ;)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы