Нахождение активных элементов ветки дерева

Romantik

TeaM PHPClub
Нахождение активных элементов ветки дерева

Приветствую, уважаемые.
есть дерево разделов
id pid name end
1 0 foo 0
2 1 bar 1
глубина дерева ограничивается по end, флаг которго означает, что это конец ветки

и собственно таблица товаров
id pid name status
1 2 product(bar) 1


в связи с такой конструкцией понадобилось логика удаления ветки, но доступ к удалению только если в этой ветке нет товаров ИЛИ есть товар, но со статусом=0
(что бы не удалить ветку с активными товарами)

подскажите как можно организовать запрос(ы) что бы получить или нет разрешение на удаление ветки?
не пойму, как можно оптимально огранизовать рекурсивный запрос до конца ветки.

Заранее благодарен за любые идеи и подсказки.
С уважением.
 

Popoff

popoff.donetsk.ua
Я думаю, что я не понял суть проблемы, но чтобы понять, почему не подходит стандартное решение, рискну его здесь предложить. Что-то типа такого:

select 1 from
tree t1,
right join tree t2 on t2.pid=t1.id
right join tree t3 on t3.pid=t2.id
...
where t1.id=? and (t1.status=1 or t2.status=1 or t3.status=1 or ...)
limit 1

?
 

Romantik

TeaM PHPClub
Popoff
глубина дерева не ограничена
приведу пример где (end) конец ветки, [ID, PID]
КАТАЛОГ:
Комплектующие[1,0]
-Материнские платы[2,1]
--ASUS[3,2]
---Intel[4,3](end)
---AMD[5,3]
----SocketA[6,5](end)
-Процессоры[7,0]
--Intel[8,7](end)
--AMD[9,7]
---BOX[10,9](end)
и вот к примеру добавляю товар
MB ASUS K8NF
(Комплектующие-Материнские платы-AMD-SocketA т.е. PID=6)


статус у этого товара 1 и значит что никакой элемент из списка Комплектующие-Материнские платы-AMD-SocketA
удалить нельзя, пока статус у товарОВ этой ветки 1

тут скорей всего готовая идея, кто делал подобное.
 

zerkms

TDD infected
Команда форума
Romantik
введи избыточность в виде поля, содержащего полный путь до узла
 

A-Lex[FM]

Web/Highload/DataScience
а не проще ли держать в структуре каталога поле с количеством активных товаров, тогда нельзя удалять ветку, если goods_count > 0

напримет в SocketA есть товар, тогда в поле счётчика ставим единичку, она же встанет в AMD, ASUS, Материнские платы и Комплектующие, тогда сразу будет видно, что удалять такой раздел нельзя, а перещитывать ити счётчики, например, кроном
 
Сверху