![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| DeamonShan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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 одним запросом? |
|||
|
||||
| BuShaRt |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1391 Регистрация: 29.6.2006 Репутация: 4 Всего: 6 |
1. Выделяем строку с ID 3 и смотрим ее PARENT_ID. 2. Делаем счетчику +1 и присвоив значению ID значение PARENT_ID возращаемся к пункту 1. 3. Когда PARENT_ID становиться равным 0 - мы дошли до корневой директории и следовательно значение счетчика в этот момент будет показывать глубину директории с изначальным ID |
|||
|
||||
| DeamonShan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 26.11.2005 Репутация: 3 Всего: 6 |
BuShaRt, опять мною нелюбимая рекурсия))) Этож если 4 подуровня, то получается 4 запроса(((
Аля... Если всю таблицу в массив зачитать и работать с массивом, если записей скажем 1000 то не сильна будет нагрузка? |
|||
|
||||
| Sanchezzz |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1670 Регистрация: 19.11.2006 Где: Voronezh Репутация: 41 Всего: 60 |
мне кажется проще 4 зпроса чем 1000масив разбирать =)
у меня недавно похожая сетуция была в обратном варианте ... паренты получить. Это сообщение отредактировал(а) Sanchezzz - 21.9.2010, 14:49 -------------------- Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS. |
|||
|
||||
| DeamonShan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 26.11.2005 Репутация: 3 Всего: 6 |
Sanchezzz, да верно, лучше запросами, там уровней-то не более 5-7... а на выгрузку данных в массив очь много времени уйдет...
|
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
DeamonShan, Можно через Join'ы
сразу получаешь весь хвост родителей, до 4-го колена. при желании - можно повторить или увеличить "глубину" запроса. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| DeamonShan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 26.11.2005 Репутация: 3 Всего: 6 |
ksnk, ну как-то фиксировано получается, если какой нить менеджер с дури надумает 15 уровень субкатегорий организовать, то я не полезу код править)))
|
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
DeamonShan, Ну а какая принципиальная разница - по одному или по 4 родителя вытаскивать за итерацию рекурсии? Кроме, конечно, количества запросов и скорости выполнения. К тому-же никто не мешает формировать этот запрос автоматически, на глубину потенциального количества родителей...
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| Sanchezzz |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1670 Регистрация: 19.11.2006 Где: Voronezh Репутация: 41 Всего: 60 |
можно на основе запроса
ksnk, сделать функцию которая в зависимости от глубины значения переменной составляет мега-запрос Oo -------------------- Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS. |
|||
|
||||
| BuShaRt |
|
||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1391 Регистрация: 29.6.2006 Репутация: 4 Всего: 6 |
Очень интересная получиться штучка, цель которой узнать количество вложения и на основе этих данных составить запрос для того, чтоб узнать количество вложений.
Массив гораздо менее гибкая структура, нежели таблица базы данных. В общем использование массивов с данными из баз данных - это прошлый век, порой возрождаемый программистами, без должной квалификации. В массивах следует хранить лишь временные данные. Что-то мне подсказывает что данная конструкция так же решена гибкости и ее маштабируемость вызовет дополнительные временные затраты программиста.
4 элементарных запрос для БД это мелочь, куда больше нагрузки произведут все другие вышеописанные действия. Рекурсия в данном случае самый простой, гибкий и стабильный метод работы, применяемый специалистами по всему миру, не стоит изобретать тут велосипед. |
||||||
|
|||||||
| DeamonShan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 26.11.2005 Репутация: 3 Всего: 6 |
Я это понял) и так и сделал, работает на ура, ну как и должно быть. Спс за советы. Только вот в таких рекурсиях без глобальных переменных не обойтись..что тоже не очень радует. |
|||
|
||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
? как это? Структура и правила построения запроса в зависимости от предполагаемой глубины - достаточно, imho, очевидны. Максимальная глубина вложений в устоявшейся системе - константа. Скорость выполнения такого запроса при установленных индексах - невелика. Вероятно даже сравнима со скоростью последовательного выполнения 4 простых запросов. А учитывая накладные расходы на рекурсию и промежуточную обработку на PHP - получаем чистый профит... Так что не все так очевидно. А вообще-то в "деревянных" данных я почему-то всехда храню еще и уровень. понятно, что получается дублирование и хранение лишней информации, но некоторые проблемы отпадают сами собой... Это сообщение отредактировал(а) ksnk - 23.9.2010, 15:13 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| BuShaRt |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1391 Регистрация: 29.6.2006 Репутация: 4 Всего: 6 |
Бесспорным фактом в таком случае остается то, что система усложняется и становиться менее гибкой и понятной, что влияет на возможности ее доработки и повышает общую сумму необходимых ресурсов для ее доработки и поддержки. Конечно, если проект маленький данное замечание не имеет смысла, ровно как и замечание к производительности, но если проект большой - его сложно становиться куда более насущной проблемой, чем кол-во запросов рекурсии. |
|||
|
||||
| DeamonShan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 503 Регистрация: 26.11.2005 Репутация: 3 Всего: 6 |
||||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |