2009-07-28 22 views
2

MySQLの親子モデルでノードの深さを計算するにはどうすればよいですか?MySQLの親子モデルの深さを計算する

私のリスト(PHPでコーディングされたもの)にインデントを作成するためには、深さが必要です。

+0

私はちょうどあなたの他の質問の再見ました:ネストされたセットモデルの移動ノードをして、私は、ネストされたセットモデルでノードを移動:-)あなたの欲求不満を理解することができますので、あなたには、いくつかの非常に矛盾する答えを与えてきたように見えます実際にはかなり簡単です(あなたのテーブルサイズにもよりますが、高価かもしれません)。あなたがまだそれに興味があるかどうか教えてください。答えを説明とともに追加することができます。 – ChssPly76

+0

そうです、それについてはかなり不満があります。私は一週間前に解決策を見つけました。私はまだそれを実装していないはずです。しかし、ネストされたセットは、私の目的のためにはうまくいきません。テーブルの多くの行を意味する多くの異なるユーザによって毎日更新される可能性が高いからです。 そのため、私はこの隣接リストモデルにノードを安全に移動できるショットを与えます。 *親指アップ* – Ivar

+0

あなたの実装で幸運。私は、隣接リストモデルを反映するために私の答えを更新しました。 – ChssPly76

答えて

1

これは、データベースでの階層の実際の実装によって異なります。ネストされたセットモデル(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に適切なインデックスがあれば、これはかなり速くなければなりません。
このアプローチの欠点は、ノードの移動中にノードレベルを更新したままにしなければならないということですが、ノード自体とその子ノードの場合と同じように、ネストされたセットと同じように

+0

ええ、私はネストされたセットで働いて、深さを計算する方法を知っていますが、ネストされたセットではなく、親子モデルからの深さが必要です。 – Ivar

+0

ところで、それは私が興味を持っている深さです(整数)、パスではありません。 – Ivar

+1

あなたは隣接リストモデルについて話しています。残念ながら理想からは遠いです - 第Nレベルのノードの深さを補うためには、N個の選択が必要です。 – ChssPly76

0

ここに貼り付けたいのは、私の例です。 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 ; 
関連する問題