MySQLの親子モデルでノードの深さを計算するにはどうすればよいですか?MySQLの親子モデルの深さを計算する
私のリスト(PHPでコーディングされたもの)にインデントを作成するためには、深さが必要です。
MySQLの親子モデルでノードの深さを計算するにはどうすればよいですか?MySQLの親子モデルの深さを計算する
私のリスト(PHPでコーディングされたもの)にインデントを作成するためには、深さが必要です。
これは古い質問かもしれませんが、私は数ヶ月前に解決策を見つけたことを他の人に伝えたいだけです。私は最近ここに書きました:http://en.someotherdeveloper.com/articles/adjacency-list-model-with-depth-calculation/
URLはもう機能していません – danielpopa
これは、データベースでの階層の実際の実装によって異なります。ネストされたセットモデル(http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/)を使用している場合、1つの選択で完全な親から子へのパスを取得できます。
更新::あなたが隣接リストモデルを使用しているので、ノードレベルをテーブルに格納することをお勧めします。だけでなく、それはあなたに1つのクエリ内のノードの深さを与えるだろうが、それはまた、あなたが(そのクエリが動的に生成されなければならないだろうが)1つのクエリでそのノードへのパス全体を検索することができます:
SELECT n1.name AS lvl1, n2.name as lvl2, n3.name as lvl3, ..., nN.name as lvlN
FROM nodes AS n1
JOIN nodes AS n2 ON n2.parent_id = n1.id
JOIN nodes AS n3 ON n3.parent_id = n2.id
...
JOIN nodes AS nN ON nN.parent_id = n(N-1).id
WHERE nN.id = myChildNode;
ので、ノードがレベルNにあることはわかっていますが、左結合の必要はなく、id/parent_idに適切なインデックスがあれば、これはかなり速くなければなりません。
このアプローチの欠点は、ノードの移動中にノードレベルを更新したままにしなければならないということですが、ノード自体とその子ノードの場合と同じように、ネストされたセットと同じように
ここに貼り付けたいのは、私の例です。 IDとPARENT_IDフィールドを持つテーブルプロジェクトがあります。
DELIMITER $$
DROP FUNCTION IF EXISTS `getDepth` $$
CREATE FUNCTION `getDepth` (project_id INT) RETURNS int
BEGIN
DECLARE depth INT;
SET depth=1;
WHILE project_id > 0 DO
SELECT IFNULL(parent_id,-1)
INTO project_id
FROM (SELECT parent_id FROM Projects WHERE id = project_id) t;
IF project_id > 0 THEN
SET depth = depth + 1;
END IF;
END WHILE;
RETURN depth;
END $$
DELIMITER ;
私はちょうどあなたの他の質問の再見ました:ネストされたセットモデルの移動ノードをして、私は、ネストされたセットモデルでノードを移動:-)あなたの欲求不満を理解することができますので、あなたには、いくつかの非常に矛盾する答えを与えてきたように見えます実際にはかなり簡単です(あなたのテーブルサイズにもよりますが、高価かもしれません)。あなたがまだそれに興味があるかどうか教えてください。答えを説明とともに追加することができます。 – ChssPly76
そうです、それについてはかなり不満があります。私は一週間前に解決策を見つけました。私はまだそれを実装していないはずです。しかし、ネストされたセットは、私の目的のためにはうまくいきません。テーブルの多くの行を意味する多くの異なるユーザによって毎日更新される可能性が高いからです。 そのため、私はこの隣接リストモデルにノードを安全に移動できるショットを与えます。 *親指アップ* – Ivar
あなたの実装で幸運。私は、隣接リストモデルを反映するために私の答えを更新しました。 – ChssPly76