我很难尝试将子节点或父节点转移或向下移动...擅长数学。

CREATE TABLE IF NOT EXISTS `pages` (   `page-id` mediumint(8) unsigned

不是null auto_increment, page-left媒介(8)未签名,而不是null,
page-right smallint(8)未签名,没有零, page-title 文字不是null,
page-content 文字不是null,
page-time int(11)未签名不是零, page-slug 文字不是null,
page-template 文字不是null,
page-parent 媒介(8)未签名,而不是null, page-type 文本不是null,主键(page-id)发动机= 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,'parent'','',0,''),(18、2、5,'2',',',0,'sub' ,'',17,''),(19,3,4,'3','',0,'sub-sub','',18,'),(20,7,8,'5 ',',',0,'test','',0,'');

例如,我将如何通过使用Page-Left/Page-Right ID进行播放,并说出在父母上方的测试并说出下方的子次数?不需要代码,只需帮助SQL概念或数学,就可以帮助我了解如何更好地移动它...

有帮助吗?

解决方案

因此,基本上您想将邻接列表转换为嵌套集吗?首先更新您的邻接列表(即。

使用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应包含一个由parent-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);

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

顺便说一下http://bytes.com/topic/mysql/answers/638123-regener-nested-set-set-usis-rent-parent_id-scructure

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top