![]() |
|
Модераторы: skyboy |
![]()
|
|
| Pokoinik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 17.3.2007 Где: /dev/null Репутация: нет Всего: 3 |
Есть таблица:
id - ид элемента pid - ид родителя в этой же таблице, если нет родителя pid=0 нужно зная ид узла выбрать все узлы составляющие путь к корню дерева... уровень узла не известен... желательно сделать используя минимальное количество запросов. Это сообщение отредактировал(а) Pokoinik - 7.12.2007, 16:54 -------------------- ICQ: 490-993 Существует только 10 типов людей: те, которые понимают двоичную систему, и которые ее не понимают!!! Опасайтесь людей верующих, ибо у них есть боги, которые им все прощают. Делай или не делай! Никаких попробую! Йода (Yoda), мастер-джедай |
|||
|
||||
| onsql |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 3.12.2007 Репутация: нет Всего: 3 |
Посмотри вот тут mysqlfaq - Common Queries
|
|||
|
||||
| Pokoinik |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 17.3.2007 Где: /dev/null Репутация: нет Всего: 3 |
onsql, данный пример мне не совсем подходит, так как у меня все узлы храняться в одной таблице, а переделывать возможности нет...
-------------------- ICQ: 490-993 Существует только 10 типов людей: те, которые понимают двоичную систему, и которые ее не понимают!!! Опасайтесь людей верующих, ибо у них есть боги, которые им все прощают. Делай или не делай! Никаких попробую! Йода (Yoda), мастер-джедай |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
тут только рекурсией. запросов столько, сколько уровней от текущего элемента до корня.
Добавлено через 4 минуты и 14 секунд причем рекурсия на стороне клиента: получил родителя узла, потом получил родителя родителя и т.д.. |
|||
|
||||
| Glip |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 473 Регистрация: 30.12.2006 Репутация: 3 Всего: 18 |
http://www.sqlteam.com/article/more-trees-hierarchies-in-sql
вот тут кажется нечто похожее. и на стороне сервера. Это сообщение отредактировал(а) Glip - 10.12.2007, 17:11 |
|||
|
||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 6 Всего: 401 |
Можно в один запрос - с многократным LEFT JOIN-ом таблицы самой на себя. Только разбирать ответ, возможно, будет непросто (идея и примеры - здесь). И максимальная глубина ограничена 31 (в старых версиях) или 63 (MySQL 5) уровнями.
-------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| Feldmarschall |
|
|||
|
Новичок ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2641 Регистрация: 11.12.2007 Репутация: 3 Всего: 32 |
Я думаю, никаких проблем рекурсивная выборка не доставит.
Другое дело, что могут быть другие запросы, а не только вычисляющие путь. поэтому лично я считаю, что если количество узлов дерева превышает несколько десятков, то лучше использовать другие способы хранения деревьев в БД |
|||
|
||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 6 Всего: 401 |
Спорный тезис, имхо. Все-таки, по части гибкости (добавление/перенос/удаление ветвей, произвольность порядка сортировки ветвей при выводе) и надежности (при повреждении одной записи бьется лишь ее подветвь, а не все дерево) у списков смежности конкурентов мало. Кроме того, во многих реальных задачах так или иначе все равно требуется все дерево целиком - а оно элементарно и быстро строится одним запросом с последующим рекурсивным разбором массива... -------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| Feldmarschall |
|
|||
|
Новичок ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2641 Регистрация: 11.12.2007 Репутация: 3 Всего: 32 |
Ну так и я о том же. Несколько сотен уже не будешь каждый раз тягать.
|
|||
|
||||
| SelenIT |
|
|||
![]() баг форума ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3996 Регистрация: 17.10.2006 Где: Pale Blue Dot Репутация: 6 Всего: 401 |
А почему бы и нет, собственно? У меня и с тысячей никогда проблем не было...
-------------------- Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму! |
|||
|
||||
| vi_k |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 29.12.2007 Репутация: нет Всего: нет |
Функция рекурсивного поиска на стороне сервера самого верхнего предка, parent_id которого равен 0.
Если такой отсутствует, возвращает NULL. Легко можно переделать под задачу автора.
Это сообщение отредактировал(а) vi_k - 31.12.2007, 05:00 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |