Использование данных из предыдущего ряда для получения следующего

Fludimir

Новичок
Использование данных из предыдущего ряда для получения следующего

Есть таблица с простой древовидной иерархией записей, типа
id data parent_id

id - ид строки, data - какие-то полезные данные, несколько колонок на самом деле, но не принципиально, parent_id - ид родительской по иерархии записи, или 0 если запись корневая

Можно ли как-то одним запросом получить результат в виде всех дочерних записей для одной родительской? Естественно безо всякой иерархии, просто список всех записей которые являются дочерними для одной конкретной записи, как дочерними первого уровня (тут простоо выборка по parent_id = id) , так и дочерними для этих дочерних и так далее.

Аналогично и наоборот - есть какая-то дочерняя запись, нужно получить для неё всех родителей родителей родителей, т.е. как-то нужно в запрос подставлять данные из полученного тут же ранее ряда

Интересно именно решение в SQL , получить иерархию в коде с помощью рекурсии проблем не составляет, но это не всегда удобно, и просто интересно можно ли это сделать только в запросе
 

Фанат

oncle terrible
Команда форума
в оракле - можно. в mysql при такой структуре - нельзя. но есть много других структур, где дерево получить одним запросом можно
 

Fludimir

Новичок
Структура такая у меня уже есть, и менять её будет проблематично. А вообще в мускуле принципиально никак нельзя при получении следующего ряда запроса использовать результат предыдущего?

ЗЫ А можно решить мою задаю с помощью процедуры/функции в мускуле? Если кому не сложно напишите пример, в этом я к сожалению плохо разбираюсь, сам их никогда не писал
 

Adelf

Administrator
Команда форума
Ты даже версию MySQL не указал.

З.Ы. Это не значит, что я собрался тут писать тебе функции :) (и врядли тут найдутся такие) Просто замечание.
 

Фанат

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

но, главное, чем рекурсия в mysql будет отличаться от рекурсии в похапе? Тем, что пхп у тебя перел гглазами, а через функцию в мускуле получать - это все равно что обои через замочную скважину клеить?

короче, читай здесь.
http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
если охота париться со списком смежности - флаг тебе в руки.
нет - придется сделать надо собой усилие и перейти на более прогрессивный формат
 

Fludimir

Новичок
Не думал я что просьба написать функцию в мускуле будет так воспринята, разве привести такой пример слишком сложно и напряжно? Ну нет так нет, ладно :)
Это все нужно было под MySQL 5

>http://dev.mysql.com/tech-resources...hical-data.html
спасибо, ознакомился

>но, главное, чем рекурсия в mysql будет отличаться от рекурсии в похапе?
У меня есть запрос, результатом которого я получаю несколько десятков-сотню "листиков" дерева, которые как-то выводятся на странице. Для каждого из листиков мне нужно также вывести его путь в иерархии. Если я буду получать иерархию в похапе - для каждого листика мне придется рекурсивно до достижения вершины дерева выполнить энное количество отдельных простых запросов, при выполнении которых больше всего времени уйдет просто на передачу данных туда-сюда. А если получением иерархии займется мускул - запросов будет такое же количество, но выполнятся они все вместе, я один раз отправлю запрос и один раз получу результат. Кроме того в коде в таком случае даже менять ничего не придется, только в шаблоне вывода странички.
Разница велика, или я не прав?
 

weregod

unserializer
позвольте себе придумать более оптимальный алгоритм и, как следствие, изменить структуру таблицы
 
Сверху