Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Дерево каталогов (Универсализируем)
Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012
Помог: 7 раз(а)
Недавно на форуме обсуждалась тема NESTED SETS - деревья каталогов без рекурсии. Ну в общем то вещь отличная и очень удобная, особенно для деревьев с редко изменяемой структурой. Отдельное спасибо пользователю DeepVarvar, за то что ткнул "носом" в такие вещи. Ну вот хорошо все и хорошо, только мне как всегда чего то не хватает, вот лежит в базе вот такая структура, просто к примеру (картинку позаимствовал в интернете, только переписал название полей). Ну здесь все ясно, если я хочу достать ветку каталогов по id узла
SELECT pn.IN,pn.out FROM node_table pn WHERE pn.id = parent_id)
ORDERBY n.IN;
Вот теперь усложняем задачу, например к каждому узлу добавим поле 'state' которое равно 1 или 0. Если равно 1 - значит узел публикуемый, если 0 - не публикуемый. И теперь нужно снова выбрать ветку, вопрос как, так чтобы если в каком нибудь узле state = 0, с этого узла больше ничего не доставалось , и сам узел соответственно тоже. Или например есть запрос который обращается на прямую к узлу по его id, допустим что глубина у него равна 8, а какого нибудь его родителя, например глубиной 2 state = 0, значит запрос по логике вещей должен вернуть ноль строк. Прикреплено изображение (Нажмите для увеличения)
SELECT id,name FROM nodes WHERE id = $id AND state =1
Этот запрос вернет строку только если state = 1. А он и так равен 1, а у его родителя, или у одного из его родителей state = 0, значит запрос должен вернуть 0 строк.
caballero
Отправлено: 27 Октября, 2012 - 10:14:33
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
тебе подзапрос нужен чтобы выбрать родителей и проверить там stste
а потом вставить в уcловие имеет ли данный элемент родителя со state 0
Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012
Помог: 7 раз(а)
caballero пишет:
а потом вставить в уcловие имеет ли данный элемент родителя со state 0
У родителя state = 1, а у родителя родителя state = 0, и так может продолжатся неизвестное количество раз. Вот например если в корневом узле state = 0, то при любом запросе мы получем 0 строк, даже если обращяемся к узлу глубиной 23.
KingStar
Отправлено: 27 Октября, 2012 - 12:01:20
Участник
Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011 Откуда: Беларусь
Помог: 69 раз(а)
caballero пишет:
тебе подзапрос нужен чтобы выбрать родителей и проверить там stste, а потом вставить в уcловие имеет ли данный элемент родителя со state 0
(SELECT COUNT(*)....... WHERE state != 0)AS counter
----- То что программа работает, не означает что она написана правильно!
dubasua
Отправлено: 27 Октября, 2012 - 12:06:56
Посетитель
Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012
Помог: 7 раз(а)
KingStar пишет:
SELECT COUNT(*) ....... WHERE state != 0) AS counter
И как же мне COUNT совместить с запросом который должен вернуть не одну строку, а все подчиненые узлы. Напишите полностью запрос пожалуйста, например для выборки всех подчиненых узлов id=3, структура таблицы как на картинке в первом сообщении, + еще одно поле pid - id родителя
KingStar
Отправлено: 27 Октября, 2012 - 12:18:59
Участник
Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011 Откуда: Беларусь
SELECT bla bla bla WHERECOLUMNBETWEEN val1 AND val2
Во вторых, есть и приятные новости. Вчера на форуме был баг, и не мог пройти авторизацию, и вот вместо того что б на форуме сидеть, я думал . И додумался я до того что, у каждого узла количество родителей равно полю depth (позиции узла от корневого узла,level). Ну вот примерно так и реализовал WHERE level = (COUNT (id) bla bla bla WHERE state=1). Вся проблема решена, еду дальше. Всем спасибо.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.