SQL запрос обхода дерева

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

SQL запрос обхода дерева

Сообщение mitaichik »

Всем привет ))

Есть простая таблица дерева:
id, parent_id, name

Так вот, name указан не везде, и в случае его отсутсвия (пустая строка) нужно взять его у родителя. Если и там его нет - то у родителя родителя, и т.д.

Реально ли реализовать такую штуку одним запросом? И если да - то как )))

P.S. Я знаю, что такое можно реализовать средствами PHP, делая кучу запросов, но интересует именно реализация с пом. MySQL сервера (может используя какие-либо хранимые процедуры, или исчо какие-либо его возможности, я в этом плохо разбираюсь)
AbS_
Сообщения: 207
Зарегистрирован: 2010.03.27, 14:02

Re: SQL запрос обхода дерева

Сообщение AbS_ »

написать процедуру.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: SQL запрос обхода дерева

Сообщение samdark »

Задача вывести всё дерево или один узел? Дерево большое? Сколько узлов?
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: SQL запрос обхода дерева

Сообщение mitaichik »

Задача вывести один узел, но если у него не задан параметр name, то взять его у вышестоящего. То что я написал - это для примера. На самом деле это для следующего: В таблице pages есть поля meta_title, meta_description, meta_keywords. Если они у страницы не заданы - их нужно взять у родителей. Если и они не заданны, то берем те что заданы в настройках сайта по умолчанию.

У битрикса такая модель задания meta-тегов, и считаю что она хороша. Вот.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: SQL запрос обхода дерева

Сообщение samdark »

А при сохранении это не решить?
zibert02
Сообщения: 203
Зарегистрирован: 2010.11.24, 17:29

Re: SQL запрос обхода дерева

Сообщение zibert02 »

тут нужен рекурсивный обход, скорее всего уже в самой модели
mitallast
Сообщения: 207
Зарегистрирован: 2010.02.21, 20:40
Откуда: Голицыно
Контактная информация:

Re: SQL запрос обхода дерева

Сообщение mitallast »

Если дерево не слишком часто обновляется, или его можно разбивать на отдельные ветки - например, по ветке комментариев на статью - то можно использовать Nested set дерево.
Тогда саюж можно будет выбрать за один запрос, типа

Код: Выделить всё

select name  from tree where root_id = :root_id and left < :left and right > :right  and name not null order by left desc limit 1
где :root - текущая ветка, :left и :right - границы текущего нода.

http://www.getinfo.ru/article610.html
http://code.google.com/p/yiiext/source/ ... odel/trees
pirrat
Сообщения: 193
Зарегистрирован: 2009.04.03, 09:41

Re: SQL запрос обхода дерева

Сообщение pirrat »

mitaichik писал(а):Задача вывести один узел, но если у него не задан параметр name, то взять его у вышестоящего. То что я написал - это для примера. На самом деле это для следующего: В таблице pages есть поля meta_title, meta_description, meta_keywords. Если они у страницы не заданы - их нужно взять у родителей. Если и они не заданны, то берем те что заданы в настройках сайта по умолчанию.

У битрикса такая модель задания meta-тегов, и считаю что она хороша. Вот.
Если у страницы только 2 уровня, то как то так:

Код: Выделить всё

 SELECT *,  COALESCE(p.`meta_title `, (SELECT `meta_title ` FROM pages  as p1 WHERE id=p.pid), (SELECT meta_title FROM settings) ) as  meta_title FROM pages as p WHERE id=2
этот запрос делает следующее - выбирает для заданной категории meta_title: первое not null значение из meta_title текущей страницы, её родителя и таблицы настроек.

для большой вложенности, лучше заюзать нестед сетс ну или морочиться с хранимыми процедурами и тд.
и в любом случае, лучше все же пересчитывать при сохранении!
Аватара пользователя
Svyatov
Сообщения: 459
Зарегистрирован: 2010.08.12, 14:50
Откуда: Санкт-Петербург
Контактная информация:

Re: SQL запрос обхода дерева

Сообщение Svyatov »

Sam Dark писал(а):А при сохранении это не решить?
+1, определять эти значения при каждом запросе страницы - слишком накладная операция. Надо определять и сохранять это на этапе сохранения страницы.
Аватара пользователя
mitaichik
Сообщения: 512
Зарегистрирован: 2010.09.24, 21:18
Откуда: Россия, Санкт-Петербург

Re: SQL запрос обхода дерева

Сообщение mitaichik »

+1, определять эти значения при каждом запросе страницы - слишком накладная операция. Надо определять и сохранять это на этапе сохранения страницы.
Да, пожалуй, Вы правы. Так и сделаем.
Ответить