我很难把子节点或父节点上下移动.数学没那么好。
创建表如果不存在
pages(page-idmediumint(8) )
非空AUTO_INCREMENT,page-left mediumint(8)无符号NULL,
page-right smallint(8)无符号NULL,page-title文本NULL,
page-content文本不为空,
page-time int(11)无符号NULL,page-slug文本NULL
page-template文本不为空,
page-parent中介(8)无符号非空,page-type文本不为空,主键(page-id) ) ENGINE=MyISAM默认CHARSET=latin1;
插入pages (page-id,page-left,page-right,page-title,page-content,page-time,page-slug,page-template,page-parent,page-type)值(17,1,6,'1','',0,‘父’,'',‘0,''),(18,2,5,'2',’0,‘子’,'',17,''),(19,3,4,“3”、“”、0、“子”、“”、“18”、“”、(20、7、8、“5”、“”、“0”、“测试”、“);
例如,我将如何将测试移至父级之上,并通过使用页左/页右ID来将SUB向下移动到SUB下面?不需要代码,只需要帮助SQL概念或数学,就可以帮助我更好地理解如何移动它.
发布于 2010-03-12 13:31:42
基本上你想把一个邻接列表转换成一个嵌套的集合?首先更新你的邻接列表。将page_parent值更新为新树的正确值),然后运行下面的转换。
使用PHP (基本代码,未经测试):
class Tree
{
private $count = 0;
private $data = array();
/**
* Rebuild nested set
*
* @param $rawData array Raw tree data
*/
public function rebuild($rawData)
{
$this->data = $rawData;
$this->count = 1;
$this->traverse(0);
}
private function traverse($id)
{
$lft = $this->count;
$this->count++;
if (isset($this->data[$id])) {
$kid = $this->data[$id];
if ($kid) {
foreach ($kid as $c) {
$this->traverse($c);
}
}
}
$rgt = $this->count;
$this->count++;
// TODO: Update left and right values to $lft & $rgt in your DB for page_id $id
...
}
}当您调用它时,$rawData应该包含一个id数组,由父id索引,您可以创建它(基于您的表结构)如下($db应该包含一个活动的PDO连接对象):
$sql = 'SELECT page_id, page_parent FROM pages ORDER BY page_parent';
$stmt = $db->prepare($sql);
$rawData = array();
$stmt->execute();
while ($row = $stmt->fetch()) {
$parent = $row['page_parent'];
$child = $row['page_id'];
if (!array_key_exists($parent, $rawData)) {
$rawData[$parent] = array();
}
$rawData[$parent][] = $child;
}要进行转换,您需要如下所示:
$tree = new Tree();
$tree->rebuild($rawData);因此,基本上,您创建了一个数组,该数组包含由父节点索引的树中的所有节点,该数组将以递归方式遍历,以确定每个节点正确的左和右值。
顺便说一句,您可以使用普通的SQL (在调整表/列名之后):http://bytes.com/topic/mysql/answers/638123-regenerate-nested-set-using-parent_id-structure
https://stackoverflow.com/questions/2432725
复制相似问题