Общие > Базы данных
Nested Set выборка ветки по id
Phoinix:
Есть дерево каталогов построеное по принципу Nested Set, так же есть id узла ветки. Для выборки родительских узлов приходится делать 2 запроса:
1. SELECT left_key, right_key, level FROM table WHERE id = \'$id\'
2. SELECT name FROM table WHERE left_key < \'$left_key\' AND right_key > \'$right_key\' AND level < \'$level\'
т.е. сначала выбираю ключи узла, а потом относительно них саму ветку. Возможно ли объединение этох 2-х запросов в один?
Макс:
1. условие
--- Цитировать ---Phoinix:
AND level < \'$level\'
--- Конец цитаты ---
лишнее. Можно и без него
2.
Примерно так (не проверял):
SELECT t1.name FROM table t1, table t2
WHERE
t2.id = $id AND ( t1.left_key < t2.left_key AND right_key > t2.right_key)
Phoinix:
Макс
Ага спасибо... как часы... только:
--- Цитировать ---t2.id = $id AND ( t1.left_key < t2.left_key AND t1.right_key > t2.right_key)
--- Конец цитаты ---
А насчет сравнения level - я знаю... это на всякий случай... и еще у меня индекс - INDEX (left_key, right_key, level)
Макс:
--- Цитировать ---Phoinix:
это на всякий случай
--- Конец цитаты ---
вообще в мане по mysql (я так понимаю ты его используешь) рекомендуют упрощать условия в WHERE чтобы ускорить выборку. То есть дополнительные уловия замедляют работу SELECT-запроса
Если у тебя есть индекс - left_key, right_key, level
то фактически, это значит, что у тебя 3 индекса:
left_key, right_key, level
left_key, right_key,
left_key,
См. ман про составные индексы
FANTAzeRus:
Для определения РОДИТЕЛЯ элемента используй getParent($id,$level); класс DBTree, если нужны все родилели то enumPath($ID, $showRoot=false)
Навигация
Перейти к полной версии