Перемещение узлов Nested sets на одном уровне

off

Новичок
Перемещение узлов Nested sets на одном уровне

Написал перемещение вниз для узлов одного и того же уровня.

Получилось так

PHP:
//Выбираем узел который перемещаем:

$sql = "SELECT * FROM c_tree WHERE id=$parent_id";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
$left_key = $row['left_key'];
$right_key = $row ['right_key'];
$level = $row['level'];
$page_id = $row['page_id'];
$p_parent_id = $row['parent_id'];

//Выбираем узел который ниже по порядку
$sql = "SELECT * FROM c_tree WHERE left_key = $right_key + 1 AND level = $level";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
$left_key_down = $row['left_key'];
$right_key_down = $row ['right_key'];

//Получаем смещения ключей каждого узла:
$skew1 = $right_key - $left_key + 1;
$skew2 = $right_key_down - $left_key_down + 1;

//Выбираем идентификаторы:
$sql = "SELECT * FROM c_tree WHERE left_key >= $left_key AND right_key <= $right_key";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
$id_move = $row ['id'];

//Меняем ключи второго узла
$sql = "UPDATE c_tree SET left_key = left_key - $skew1, right_key = right_key - $skew1 WHERE left_key >= $left_key_down AND right_key <= $right_key_down";
$res = mysql_query($sql);

//Меняем ключи перемещаемого узла:

$sql = "UPDATE c_tree SET left_key = left_key + $skew2, right_key = right_key + $skew2 WHERE id IN ($id_move)";
$res = mysql_query($sql);
Все рботет, если у той записи,кот. мы перемещеаем и последующей нету потомков. Если есть, то все литит в трубу. В чем может быть проблема?
 

Popoff

popoff.donetsk.ua
Это читал
http://phpclub.ru/faq/Tree
?

-~{}~ 26.09.05 22:55:

По поводу "полета в трубу" там, кстати, тоже фраза была. Как раз а контексте перемещения узлов на одном уровне %) Ну просто дежавю какое-то %)
 

off

Новичок
Я это читал когда-то. Просто фраза запомеилась :)
Там про это написано 2 строчки

Как можно перемещать элементы дерева вверх-вниз на одном уровне?


JVN
Вверх-вниз – это уже не на одном уровне.
 

off

Новичок
ну так... ???

-~{}~ 27.09.05 00:11:

В чем может быть проблема?
 

crocodile2u

http://vbolshov.org.ru
Как-то раз писал процедуру на plpgsql для перемещения узлов. Порыться - могу отыскать. Коряво немного, но работало. И не только для одного уровня...
 

Popoff

popoff.donetsk.ua
crocodile2u
на той страничке, на которую я привел ссылку, есть готовые процедуры. не в единственном экземпляре. как в моем авторстве, так и в авторстве других программистов. для перемещения внутри уровня, между уровнями, вверх, вниз, относительно текущего положения или в любое новое положение, братом или ребенком справа или слева. и даже перемещение нескольких узлов одним запросом. для тех, кто боится корявости, там есть автоматические тесты.
 

crocodile2u

http://vbolshov.org.ru
Да я знаю, что такие вещи есть... Но замечание по делу: пожалуй, я зря свой пост здесь вставил - незачем предлагать решение, которое сам считаешь "немного корявым".
 

off

Новичок
Разобрался сам. Надо было выбирать не 1 конкретный id, но и id детей перемещаемого узла.

Получалось так. Мож кому пригодиться.

PHP:
parent_id = $_GET['id'];

$sql = "SELECT * FROM c_tree WHERE id=$parent_id";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
$left_key = $row['left_key'];
$right_key = $row ['right_key'];
$level = $row['level'];
$page_id = $row['page_id'];
$p_parent_id = $row['parent_id'];

$sql = "SELECT * FROM c_tree WHERE left_key = $right_key + 1 AND level = $level";
//echo $sql;
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
$left_key_down = $row['left_key'];
$right_key_down = $row ['right_key'];

$skew1 = $right_key - $left_key + 1;
$skew2 = $right_key_down - $left_key_down + 1;

//Выбираем id детей перемещаемого узла
$sql = "SELECT * FROM c_tree WHERE left_key >= $left_key and right_key <= $right_key";
$id_move = array();
$res = mysql_query($sql);

$i=0;
while ($row = mysql_fetch_array($res)){
	
	$id_move[$i] = $row['id']; //Загоняем все эти id в массив
	
	$i++;
}

//Меняем ключи узла того же уровня, кот. ниже по порядку
$sql = "UPDATE c_tree SET left_key = left_key - $skew1, right_key = right_key - $skew1 WHERE left_key >= $left_key_down AND right_key <= $right_key_down"; 
$res = mysql_query($sql); 

//Меняем ключи перемещаемого узла
for ($i=0;$i<=count($id_move);$i++){
	
	$sql = "UPDATE c_tree SET left_key = left_key + $skew2, right_key = right_key + $skew2 WHERE id=".$id_move[$i];
	mysql_query($sql);
}
 
Сверху