Forum Webscript.Ru

Общие => Базы данных => Тема начата: Phoinix от 26 Мая 2004, 17:38:48

Название: Nested Set выборка ветки по id
Отправлено: Phoinix от 26 Мая 2004, 17:38:48
Есть дерево каталогов построеное по принципу 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-х запросов в один?
Название: Nested Set выборка ветки по id
Отправлено: Макс от 26 Мая 2004, 19:01:45
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)
Название: Nested Set выборка ветки по id
Отправлено: Phoinix от 26 Мая 2004, 20:22:00
Макс
Ага спасибо... как часы... только:
Цитировать
t2.id = $id AND ( t1.left_key < t2.left_key AND t1.right_key > t2.right_key)


А насчет сравнения level - я знаю... это на всякий случай... и еще у меня индекс - INDEX (left_key, right_key, level)
Название: Nested Set выборка ветки по id
Отправлено: Макс от 26 Мая 2004, 22:18:31
Цитировать
Phoinix:
это на всякий случай
вообще в мане по mysql (я так понимаю ты его используешь) рекомендуют упрощать условия в WHERE чтобы ускорить выборку. То есть дополнительные уловия замедляют работу SELECT-запроса

Если у тебя есть индекс - left_key, right_key, level
то фактически, это значит, что у тебя 3 индекса:
left_key, right_key, level
left_key, right_key,
left_key,
См. ман про составные индексы
Название: Nested Set выборка ветки по id
Отправлено: FANTAzeRus от 15 Июня 2004, 14:27:19
Для определения РОДИТЕЛЯ элемента используй getParent($id,$level); класс DBTree, если нужны все родилели то enumPath($ID, $showRoot=false)
Название: Nested Set выборка ветки по id
Отправлено: Макс от 15 Июня 2004, 16:32:47
FANTAzeRus
тут никто не писал что речь идет о ПХП
Название: Nested Set выборка ветки по id
Отправлено: FANTAzeRus от 15 Июня 2004, 17:32:45
Вот ЗАПРОС из класса:

        function getParent($ID, $level=1) {
                if($level < 1) die("phpDbTree error: ".$this->db->error());

                $this->sql = $this->sqlComposeSelect(array(
                        \'\', // Params
                        \'\', // Fields
                        $this->table.\' _\'.$this->table.\', \'.$this->table, // Tables
                        \'_\'.$this->table.\'.\'.$this->id.\'=\\\'\'.$ID.\'\\\'\'
                                .\' AND _\'.$this->table.\'.\'.$this->left.\' BETWEEN \'.$this->table.\'.\'.$this->left.\' AND \'.$this->table.\'.\'.$this->right
                                .\' AND \'.$this->table.\'.\'.$this->level.\'=_\'.$this->table.\'.\'.$this->level.\'-\'.(int)$level // Where
                ));

                return $this->db->query($this->sql);
        }
Название: Nested Set выборка ветки по id
Отправлено: Phoinix от 15 Июня 2004, 18:42:44
FANTAzeRus

В принципе, спасибо,но я пишу на Perl, и потом, лучше разобраться в запросах самому, чем пользоваться готовыми, не имея понятия о их структуре...

Тем более показанная функция, требует еще и разбора, т.к. я не знаю что за объект $this и что за методы ты к нему применяешь... Модуля такого я для Perl не нашел

Цитировать
Warning: Cannot install DBTree, don\'t know what it is.


P.S. Тем более что проблема уже решена ;)
Название: Nested Set выборка ветки по id
Отправлено: Макс от 15 Июня 2004, 19:42:18
кстати, автор DBTree (и я тоже) считает что класс целесообразно использовать только для добавления/удаления/перемещения узлов.
А селекты рекомендует писать самому