0

サブノードまたは親ノードを上下に移動しようとすると問題が発生します...数学が苦手です。

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

NOT NULL AUTO_INCREMENT, page-left mediumint(8) unsigned NOT NULL,
page-rightsmallint(8) unsigned NOT NULL, page-titletext NOT NULL,
page-contenttext NOT NULL,
page-timeint(11) unsigned NOT NULL, page-slugtext NOT NULL,
page-templatetext NOT NULL,
page-parentmediumint(8) unsigned NOT NULL、 page-typeテキスト NOT NULL、主キー ( page-id) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;

INSERT INTO pages( page-id, page-left, page-right, page-title, page-content, page-time, page-slug, page-template, ) 値 (17 page-parent, page-type1, 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, 'テスト', '', 0, '');

例として、ページ左/ページ右の ID を操作して、TEST を PARENT の上に移動し、SUB を SUB-SUB の下に移動する方法を教えてください。コードは必要ありません。SQL の概念や数学を理解するだけで、コードをより適切に動かす方法を理解するのに役立ちます...

4

1 に答える 1

3

基本的に、隣接リストをネストされたセットに変換したいですか?最初に隣接リストを更新 (つまり、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 には、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);

したがって、基本的には、親によってインデックス付けされたツリー内のすべてのノードを含む配列を作成します。これは、ノードごとに正しい左右の値を決定するために再帰的にトラバースされます。

ところで、プレーンSQLでそれを行うことができます(テーブル/列名を調整した後): http://bytes.com/topic/mysql/answers/638123-regenerate-nested-set-using-parent_id-structure

于 2010-03-12T13:31:42.577 に答える