Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2012, 21:07   #1
Никки
Форумчанин Подтвердите свой е-майл
 
Аватар для Никки
 
Регистрация: 20.11.2007
Сообщений: 500
Стрелка Рекурсивный запрос

Есть таблица такой структуры:

Код:
id     parent_id    message
1           0           тест
2           0           тест
3           1           тест
4           3           тест
5           1           тест
6           2           тест
7           5           тест
8           7           тест
И так далее. В некотором роде "корни деревьев и их ветви".

Известен id (ветки, корня, листочка - не важно) и по нему надо извлечь всю ветку, например по id = 3 надо получить:

Код:
1-тест
   5-тест
      7-тест
         8-тест
   3-тест
      4-тест
Сортировка обратная, т.е. ветки с большим id располагаются ближе к корню.

Как это сделать с помощью одного sql запроса? Нужно использовать какие-то рекурсивные запросы? Или подзапросы? Или что-то ещё?

Запрос должен выполняться в mysql.

Больше спасибо за помощь.

Последний раз редактировалось Никки; 13.03.2012 в 21:14.
Никки вне форума Ответить с цитированием
Старый 13.03.2012, 21:48   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Копать в сторону рекурсивніх хранимых процедур и ссылочка http://www.sql.ru/forum/actualthread...id=6&tid=27688
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.03.2012, 08:12   #3
Никки
Форумчанин Подтвердите свой е-майл
 
Аватар для Никки
 
Регистрация: 20.11.2007
Сообщений: 500
По умолчанию

В общем в mysql с этим какая то проблема. И у меня только 2 выхода:
1) делать всё с помощью языка программирования, посылая несколько запросов - долгое время извлечения дерева
2) добавить 2 поля в таблицу и по ним выбирать дерево, тогда извлечение будет быстрым, а вот чтобы вставить ветку нужно будет все индексы у следующих записей передвинуть. т.е. тут вставка будет долгой...

И вот кажется придумался самый оптимальный вариант:
3) добавить в каждую поле three_id и извлекать всё дерево по нему! )

Последний раз редактировалось Stilet; 14.03.2012 в 22:48.
Никки вне форума Ответить с цитированием
Старый 14.03.2012, 08:44   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
В общем в mysql с этим какая то проблема
Нет никаких проблем, просто SQL к рекурсиям не приспособлен и не предназначен для этого. В оракле в языке есть какая-то примочка для этих целей, а так больше и не встречал. По поводу 3-его - а xml просто использовать?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.03.2012, 20:15   #5
Никки
Форумчанин Подтвердите свой е-майл
 
Аватар для Никки
 
Регистрация: 20.11.2007
Сообщений: 500
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
По поводу 3-его - а xml просто использовать?
не знаю... я в общем уже сделал несколько запросов и переборку в коде. Всего раза в 2-3 дольше получается... но всё равно быстро.

Если будут большие нагрузки потом переделаю.
Никки вне форума Ответить с цитированием
Старый 23.03.2012, 03:10   #6
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2Аватар
Цитата:
Нет никаких проблем, просто SQL к рекурсиям не приспособлен и не предназначен для этого
это было давно и неправда. уже в стандарте SQL-1999 есть оператор WITH. присутствует и в оракле, и в мсскуэле, и в дб2(в дб2 как раз и появился изначально)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 23.03.2012, 15:21   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
уже в стандарте SQL-1999 есть оператор WITH. присутствует и в оракле, и в мсскуэле
Точно, начиная с 2005 в MSSQL появилась. Извиняюсь перед ТС, если ввел в заблуждение
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.03.2012, 15:35   #8
hook778
Новичок
Джуниор
 
Регистрация: 22.03.2012
Сообщений: 1
По умолчанию допоможіть життю людини !!!

Це – рак легенів, злоякісна пухлина, – повідомив власкор ЗІКу.

Андрієві лише 23 роки. Він – життєрадісний і доброзичливий, завжди готовий прийти на допомогу. Кілька місяців юнака лікували від плевриту, провели дві операції. Однак днями медики встановили страшний діагноз, який згодом підтвердили у столичній лабораторії – аденокарцинома правої легені.

Юнак потребує дуже дорогого лікування (у тому числі й за кордоном), а таких коштів у сім’ї Андрія немає. Тому родина просить усіх, кому не байдужа доля молодої людини, допомогти.

Ось єдині реквізити для перерахунку коштів(lдопоможіть чим можете):webmoney
WMID: 200235489688
R270406892617
Z431134896206
hook778 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсивный поиск zumm Общие вопросы Delphi 7 01.11.2010 22:47
C# - Рекурсивный метод Ronnie Помощь студентам 2 10.06.2010 08:30
рекурсивный алгоритм. Nelson1992 Помощь студентам 9 21.03.2010 12:09
Рекурсивный алгоритм SVM Общие вопросы C/C++ 7 13.11.2009 09:24
Рекурсивный SQL запрос ADSoft SQL, базы данных 5 02.06.2008 16:55