Автор Тема: Nested Set выборка ветки по id  (Прочитано 4441 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Nested Set выборка ветки по id
« : 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-х запросов в один?

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Nested Set выборка ветки по id
« Ответ #1 : 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)
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Nested Set выборка ветки по id
« Ответ #2 : 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)

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Nested Set выборка ветки по id
« Ответ #3 : 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,
См. ман про составные индексы
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн FANTAzeRus

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 93
  • +0/-0
  • 0
    • Просмотр профиля
Nested Set выборка ветки по id
« Ответ #4 : 15 Июня 2004, 14:27:19 »
Для определения РОДИТЕЛЯ элемента используй getParent($id,$level); класс DBTree, если нужны все родилели то enumPath($ID, $showRoot=false)

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Nested Set выборка ветки по id
« Ответ #5 : 15 Июня 2004, 16:32:47 »
FANTAzeRus
тут никто не писал что речь идет о ПХП
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн FANTAzeRus

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 93
  • +0/-0
  • 0
    • Просмотр профиля
Nested Set выборка ветки по id
« Ответ #6 : 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);
        }

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Nested Set выборка ветки по id
« Ответ #7 : 15 Июня 2004, 18:42:44 »
FANTAzeRus

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

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

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


P.S. Тем более что проблема уже решена ;)

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Nested Set выборка ветки по id
« Ответ #8 : 15 Июня 2004, 19:42:18 »
кстати, автор DBTree (и я тоже) считает что класс целесообразно использовать только для добавления/удаления/перемещения узлов.
А селекты рекомендует писать самому
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28