1
Базы данных / Nested Set Поменять ветки местами на одном уровне
« : 26 Сентября 2005, 23:34:20 »
Попробовал все как ты сказал, phoinix.
Перемещение вниз
Получилось так
//Выбираем узел который перемещаем:
$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);
Все рботет, если у той записи,кот. мы перемещеаем и последующей нету потомков. Если есть, то все литит в трубу. В чем может быть проблема?
Перемещение вниз
Получилось так
//Выбираем узел который перемещаем:
$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);
Все рботет, если у той записи,кот. мы перемещеаем и последующей нету потомков. Если есть, то все литит в трубу. В чем может быть проблема?