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 :: Дерево каталогов (Универсализируем)

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Добавление параметров к выводу
dubasua
Отправлено: 26 Октября, 2012 - 23:18:06
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Недавно на форуме обсуждалась тема NESTED SETS - деревья каталогов без рекурсии. Ну в общем то вещь отличная и очень удобная, особенно для деревьев с редко изменяемой структурой. Отдельное спасибо пользователю DeepVarvar, за то что ткнул "носом" в такие вещи. Ну вот хорошо все и хорошо, только мне как всегда чего то не хватает, вот лежит в базе вот такая структура, просто к примеру (картинку позаимствовал в интернете, только переписал название полей). Ну здесь все ясно, если я хочу достать ветку каталогов по id узла
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT id FROM node_table n
  3. WHERE n.IN BETWEN(
  4.   SELECT pn.IN,pn.out FROM node_table pn WHERE pn.id = parent_id)
  5.   ORDER BY n.IN;
  6.  

Вот теперь усложняем задачу, например к каждому узлу добавим поле 'state' которое равно 1 или 0. Если равно 1 - значит узел публикуемый, если 0 - не публикуемый. И теперь нужно снова выбрать ветку, вопрос как, так чтобы если в каком нибудь узле state = 0, с этого узла больше ничего не доставалось , и сам узел соответственно тоже. Или например есть запрос который обращается на прямую к узлу по его id, допустим что глубина у него равна 8, а какого нибудь его родителя, например глубиной 2 state = 0, значит запрос по логике вещей должен вернуть ноль строк.
Прикреплено изображение (Нажмите для увеличения)
sets.png

(Отредактировано автором: 26 Октября, 2012 - 23:23:34)

 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Октября, 2012 - 23:47:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




???
 
 Top
dubasua
Отправлено: 27 Октября, 2012 - 00:32:17
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Не катит.

(Отредактировано автором: 27 Октября, 2012 - 09:12:44)

 
 Top
dubasua
Отправлено: 27 Октября, 2012 - 09:06:47
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




DeepVarvar пишет:
WHERE state != 0

Так сработает только для прямого вызова
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT id,name FROM nodes WHERE id = $id AND state = 1
  3.  

Этот запрос вернет строку только если state = 1. А он и так равен 1, а у его родителя, или у одного из его родителей state = 0, значит запрос должен вернуть 0 строк.
 
 Top
caballero
Отправлено: 27 Октября, 2012 - 10:14:33
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




тебе подзапрос нужен чтобы выбрать родителей и проверить там stste
а потом вставить в уcловие имеет ли данный элемент родителя со state 0


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
dubasua
Отправлено: 27 Октября, 2012 - 10:19:35
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




caballero пишет:
а потом вставить в уcловие имеет ли данный элемент родителя со state 0

У родителя state = 1, а у родителя родителя state = 0, и так может продолжатся неизвестное количество раз. Вот например если в корневом узле state = 0, то при любом запросе мы получем 0 строк, даже если обращяемся к узлу глубиной 23.
 
 Top
KingStar
Отправлено: 27 Октября, 2012 - 12:01:20
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)




caballero пишет:
тебе подзапрос нужен чтобы выбрать родителей и проверить там stste, а потом вставить в уcловие имеет ли данный элемент родителя со state 0


только не выборка, а мб подсчет сделать

PHP:
скопировать код в буфер обмена
  1. (SELECT COUNT(*) ....... WHERE state != 0) AS counter


-----
То что программа работает, не означает что она написана правильно!
 
 Top
dubasua
Отправлено: 27 Октября, 2012 - 12:06:56
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




KingStar пишет:
SELECT COUNT(*) ....... WHERE state != 0) AS counter

И как же мне COUNT совместить с запросом который должен вернуть не одну строку, а все подчиненые узлы. Напишите полностью запрос пожалуйста, например для выборки всех подчиненых узлов id=3, структура таблицы как на картинке в первом сообщении, + еще одно поле pid - id родителя
 
 Top
KingStar
Отправлено: 27 Октября, 2012 - 12:18:59
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)




по логике, что-то вроде того

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2.    id
  3. FROM
  4.    node_table n
  5. WHERE
  6.    n.IN BETWEN(
  7.    SELECT
  8.           pn.IN,
  9.           pn.out,
  10.           (SELECT COUNT(*) FROM node_table r WHERE r.id = pn.id AND r.state != 0) AS counter
  11.    FROM
  12.           node_table pn
  13.    WHERE pn.id = parent_id
  14.    AND counter != 0)
  15. ORDER BY n.IN;


-----
То что программа работает, не означает что она написана правильно!
 
 Top
dubasua
Отправлено: 27 Октября, 2012 - 12:33:07
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




KingStar пишет:
SELECT COUNT(*) FROM node_table r WHERE r.id = pn.id AND r.state != 0

И этот подзапрос вернет больше 0, потому что, state = 0 только у одного родителя, даже не у родителя, а у родителя родителя.
 
 Top
caballero
Отправлено: 27 Октября, 2012 - 12:37:10
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
только не выборка, а мб подсчет сделать

вообще то правильнее EXISTS


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
KingStar
Отправлено: 27 Октября, 2012 - 12:38:11
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


Помог: 69 раз(а)




этот запрос вернет больше 0 если

CODE (htmlphp):
скопировать код в буфер обмена
  1. AS counter
  2. ...
  3. AND counter != 0

(Добавление)
caballero пишет:
вообще то правильнее EXISTS
давайте не будем Хорошо я излагаю простым языком Подмигивание


-----
То что программа работает, не означает что она написана правильно!
 
 Top
dubasua
Отправлено: 27 Октября, 2012 - 12:52:32
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Буду дома проверю, но я уже вижу что не будет работать, но я могу и ошибаться.
 
 Top
caballero
Отправлено: 27 Октября, 2012 - 13:28:08
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
давайте не будем я излагаю простым языком

лично я предпочитаю излагать техническим языком Улыбка


Цитата:
Буду дома проверю, но я уже вижу что не будет работать, но я могу и ошибаться.

После определенных танцев с бубном будет работать даже дома.
Но алгоритм с материализоваными путями обычно позволяет оных танцев избежать.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
dubasua
Отправлено: 28 Октября, 2012 - 17:15:17
Post Id



Посетитель


Покинул форум
Сообщений всего: 454
Дата рег-ции: Апр. 2012  


Помог: 7 раз(а)




Кароч, не работает все то что мы тут придумывали. Во первых оператор BETWEEN не позволяет делать такие вещи
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT bla bla bla WHERE COLUMN BETWEEN(SELECT col1,col2 bla blabla)
  3.  

Синтаксис не позволяет. Нужно что бы строго было вот так
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT bla bla bla WHERE COLUMN BETWEEN val1 AND val2
  3.  


Во вторых, есть и приятные новости. Вчера на форуме был баг, и не мог пройти авторизацию, и вот вместо того что б на форуме сидеть, я думал Радость . И додумался я до того что, у каждого узла количество родителей равно полю depth (позиции узла от корневого узла,level). Ну вот примерно так и реализовал WHERE level = (COUNT (id) bla bla bla WHERE state=1). Вся проблема решена, еду дальше. Всем спасибо.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB