質問
サブノードや親ノードを上下に移動しようとするのに苦労しています...数学はそれほど得意ではありません。
CREATE TABLE IF NOT EXISTS `pages` ( `page-id` mediumint(8) unsigned
null auto_incrementではありません、
page-left
Mediunint(8)nullではない符号なし、
page-right
smallint(8)nullではない符号なし、page-title
nullではなくテキスト、
page-content
nullではなくテキスト、
page-time
int(11)nullではない符号なし、page-slug
nullではなくテキスト、
page-template
nullではなくテキスト、
page-parent
Mediunint(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、' ');
たとえば、テストを親の上に移動し、ページ左/ページの右IDで遊んでサブサブの下にサブ下に移動すると言うにはどうすればよいですか?コードは、SQLの概念や数学を支援するだけでは必要ありません。それをより良く動かす方法を理解するのに役立ちます...
解決
基本的に、隣接リストをネストされたセットに変換したいですか?最初に隣接リストを更新します(つまり、新しいツリーの正しい値に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