Forum Webscript.Ru
Общие => Базы данных => Тема начата: 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-х запросов в один?
-
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)
-
Макс
Ага спасибо... как часы... только:
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,
См. ман про составные индексы
-
Для определения РОДИТЕЛЯ элемента используй getParent($id,$level); класс DBTree, если нужны все родилели то enumPath($ID, $showRoot=false)
-
FANTAzeRus
тут никто не писал что речь идет о ПХП
-
Вот ЗАПРОС из класса:
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);
}
-
FANTAzeRus
В принципе, спасибо,но я пишу на Perl, и потом, лучше разобраться в запросах самому, чем пользоваться готовыми, не имея понятия о их структуре...
Тем более показанная функция, требует еще и разбора, т.к. я не знаю что за объект $this и что за методы ты к нему применяешь... Модуля такого я для Perl не нашел
Warning: Cannot install DBTree, don\'t know what it is.
P.S. Тем более что проблема уже решена ;)
-
кстати, автор DBTree (и я тоже) считает что класс целесообразно использовать только для добавления/удаления/перемещения узлов.
А селекты рекомендует писать самому