首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移动mySQL树节点

移动mySQL树节点
EN

Stack Overflow用户
提问于 2010-03-12 12:40:47
回答 1查看 1.6K关注 0票数 0

我很难把子节点或父节点上下移动.数学没那么好。

创建表如果不存在pages ( page-id mediumint(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-idpage-leftpage-rightpage-titlepage-contentpage-timepage-slugpage-templatepage-parentpage-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概念或数学,就可以帮助我更好地理解如何移动它.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-03-12 13:31:42

基本上你想把一个邻接列表转换成一个嵌套的集合?首先更新你的邻接列表。将page_parent值更新为新树的正确值),然后运行下面的转换。

使用PHP (基本代码,未经测试):

代码语言:javascript
复制
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连接对象):

代码语言:javascript
复制
    $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;
    }

要进行转换,您需要如下所示:

代码语言:javascript
复制
$tree = new Tree();
$tree->rebuild($rawData);

因此,基本上,您创建了一个数组,该数组包含由父节点索引的树中的所有节点,该数组将以递归方式遍历,以确定每个节点正确的左和右值。

顺便说一句,您可以使用普通的SQL (在调整表/列名之后):http://bytes.com/topic/mysql/answers/638123-regenerate-nested-set-using-parent_id-structure

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2432725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档