Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многоуровневые группы, определить глубину 
V
    Опции темы
DeamonShan
Дата 21.9.2010, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: 3
Всего: 6



Здрасте.

Есть таблица в БД. В таблице храняться многоуровневые категории:

поля:
ID|PARENT_ID|NAME|ORD

где ID - индетификатор строки в категории
PARENT_ID - индентификатор родителькоой группы
NAME - название группы
ORD - сортировка

есть, к примеру, такие записи:

1 0 Main 0
2 1 SUB_Main_1 0
3 2 SUB_SUB_Main_1 0
4 1 SUB_MAIN_2 0

Соответвенно уровни:

Main - первый уровень
SUB_Main_1 - второй уровень
SUB_SUB_Main_1 - третий уровень
SUB_MAIN_2 - второй уровень

Например, посылаю запрос с ID=3

Как определить уровень вложености группы с идентификатором ID=3 одним запросом?
PM MAIL   Вверх
BuShaRt
Дата 21.9.2010, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



Цитата(DeamonShan @  21.9.2010,  12:51 Найти цитируемый пост)

Например, посылаю запрос с ID=3


1. Выделяем строку с ID 3 и смотрим ее PARENT_ID.
2. Делаем счетчику +1 и присвоив значению ID значение PARENT_ID возращаемся к пункту 1.
3. Когда PARENT_ID становиться равным 0 - мы дошли до корневой директории и следовательно значение счетчика в этот момент будет показывать глубину директории с изначальным ID

PM MAIL   Вверх
DeamonShan
Дата 21.9.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: 3
Всего: 6



BuShaRt, опять мною нелюбимая рекурсия))) Этож если 4 подуровня, то получается 4 запроса(((

Аля... Если всю таблицу в массив зачитать и работать с массивом, если записей скажем 1000 то не сильна будет нагрузка?
PM MAIL   Вверх
Sanchezzz
Дата 21.9.2010, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



мне кажется проще 4 зпроса чем 1000масив разбирать =)  

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

Это сообщение отредактировал(а) Sanchezzz - 21.9.2010, 14:49


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
DeamonShan
Дата 21.9.2010, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: 3
Всего: 6



Sanchezzz, да верно, лучше запросами, там уровней-то не более 5-7... а на выгрузку данных в массив очь много времени уйдет...
PM MAIL   Вверх
ksnk
Дата 21.9.2010, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



DeamonShan, Можно через Join'ы
Код

select t1.id, t1.PARENT_ID, t2.PARENT_ID,t3.PARENT_ID,t4.PARENT_ID 
from test as t1
 left join test as t2 on t2.id=t1.PARENT_ID
 left join test as t3 on t3.id=t2.PARENT_ID
 left join test as t4 on t4.id=t3.PARENT_ID
where t1.id=XXX

сразу получаешь весь хвост родителей, до 4-го колена. при желании - можно повторить или увеличить "глубину" запроса.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
DeamonShan
Дата 21.9.2010, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: 3
Всего: 6



ksnk, ну как-то фиксировано получается, если какой нить менеджер с дури надумает 15 уровень субкатегорий организовать, то я не полезу код править)))
PM MAIL   Вверх
ksnk
Дата 21.9.2010, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



DeamonShan, Ну а какая принципиальная разница - по одному или по 4 родителя вытаскивать за итерацию рекурсии? Кроме, конечно, количества запросов и скорости выполнения. К тому-же никто не мешает формировать этот запрос автоматически, на глубину потенциального количества родителей...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Sanchezzz
Дата 22.9.2010, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



можно на основе запроса 
ksnk,  сделать функцию которая в зависимости от глубины значения переменной составляет мега-запрос Oo


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
BuShaRt
Дата 23.9.2010, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



Цитата(Sanchezzz @  22.9.2010,  08:44 Найти цитируемый пост)
можно на основе запроса 
ksnk,  сделать функцию которая в зависимости от глубины значения переменной составляет мега-запрос Oo

Очень интересная получиться штучка, цель которой узнать количество вложения и на основе этих данных составить запрос для того, чтоб узнать количество вложений.


Цитата(DeamonShan @  21.9.2010,  14:31 Найти цитируемый пост)
Аля... Если всю таблицу в массив зачитать и работать с массивом, если записей скажем 1000 то не сильна будет нагрузка? 

Массив гораздо менее гибкая структура, нежели таблица базы данных. В общем использование массивов с данными из баз данных - это прошлый век, порой возрождаемый программистами, без должной квалификации. В массивах следует хранить лишь временные данные.


Цитата(ksnk @  21.9.2010,  15:18 Найти цитируемый пост)
select t1.id, t1.PARENT_ID, t2.PARENT_ID,t3.PARENT_ID,t4.PARENT_ID 
from test as t1
 left join test as t2 on t2.id=t1.PARENT_ID
 left join test as t3 on t3.id=t2.PARENT_ID
 left join test as t4 on t4.id=t3.PARENT_ID
where t1.id=XXX

Что-то мне подсказывает что данная конструкция так же решена гибкости и ее маштабируемость вызовет дополнительные временные затраты программиста.


Цитата(DeamonShan @  21.9.2010,  14:31 Найти цитируемый пост)
опять мною нелюбимая рекурсия))) Этож если 4 подуровня, то получается 4 запроса(((

4 элементарных запрос для БД это мелочь, куда больше нагрузки произведут все другие вышеописанные действия.
Рекурсия в данном случае самый простой, гибкий и стабильный метод работы, применяемый специалистами по всему миру, не стоит изобретать тут велосипед.
PM MAIL   Вверх
DeamonShan
Дата 23.9.2010, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: 3
Всего: 6



Цитата(BuShaRt @  23.9.2010,  14:41 Найти цитируемый пост)
элементарных запрос для БД это мелочь, куда больше нагрузки произведут все другие вышеописанные действия.
Рекурсия в данном случае самый простой, гибкий и стабильный метод работы, применяемый специалистами по всему миру, не стоит изобретать тут велосипед. 

Я это понял) и так и сделал, работает на ура, ну как и должно быть. 

Спс за советы. Только вот в таких рекурсиях без глобальных переменных не обойтись..что тоже не очень радует.
PM MAIL   Вверх
ksnk
Дата 23.9.2010, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(BuShaRt @  23.9.2010,  14:41 Найти цитируемый пост)
Что-то мне подсказывает что данная конструкция так же решена гибкости и ее маштабируемость вызовет дополнительные временные затраты программиста.

? как это? Структура и правила построения запроса в зависимости от предполагаемой глубины - достаточно, imho, очевидны. Максимальная глубина вложений в устоявшейся системе - константа. Скорость выполнения такого запроса при установленных индексах - невелика. Вероятно даже сравнима со скоростью последовательного выполнения 4 простых запросов. А учитывая накладные расходы на рекурсию и промежуточную обработку на PHP - получаем чистый профит...
Так что не все так очевидно.  smile 

А вообще-то в "деревянных" данных я почему-то всехда храню еще и уровень. понятно, что получается дублирование и хранение лишней информации, но некоторые проблемы отпадают сами собой...

Это сообщение отредактировал(а) ksnk - 23.9.2010, 15:13


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
BuShaRt
Дата 23.9.2010, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



Цитата(ksnk @  23.9.2010,  15:12 Найти цитируемый пост)
Максимальная глубина вложений в устоявшейся системе - константа.


Цитата(ksnk @  23.9.2010,  15:12 Найти цитируемый пост)
А вообще-то в "деревянных" данных я почему-то всехда храню еще и уровень.


Бесспорным фактом в таком случае остается то, что система усложняется и становиться менее гибкой и понятной, что влияет на возможности ее доработки и повышает общую сумму необходимых ресурсов для ее доработки и поддержки. Конечно, если проект маленький данное замечание не имеет смысла, ровно как и замечание к производительности, но если проект большой - его сложно становиться куда более насущной проблемой, чем кол-во запросов рекурсии. 

 smile Вообще я пришел к выводу, что развитие программирования невозможно без увлечение нагрузки на компьютер, пример этому столь популярная ныне библиотека JQuery - до появление ее и аналогов, использования библиотек считалось необходимым в исключительных случаях т.е. несло дополнительную нагрузку, ну а теперь эти библиотеки на каждом шагу. Бесспорным остается тот факт, что использовать ресурсы тоже надо рационально.
PM MAIL   Вверх
DeamonShan
Дата 24.9.2010, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 503
Регистрация: 26.11.2005

Репутация: 3
Всего: 6



Цитата(BuShaRt @  23.9.2010,  18:41 Найти цитируемый пост)
Бесспорным остается тот факт, что использовать ресурсы тоже надо рационально. 



Цитата(ksnk @  23.9.2010,  15:12 Найти цитируемый пост)
А вообще-то в "деревянных" данных я почему-то всехда храню еще и уровень.


Вот так и сделал! рекурсии нет,  один запрос, намного легче стало.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0591 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.