質問

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

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

役に立ちましたか?

解決 2

これは古い質問かもしれませんが、数ヶ月前に解決策を見つけたことを他の人に知らせたいだけです。私は最近ここでそれについて書きました: http://en.sometherdeveloper.com/articles/adjacency-list-model-with-depth-calculation/

他のヒント

これは、データベース内の階層の実際の実装に依存します。ネストされたセットモデルを使用している場合(http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/)単一の選択を介して、完全な親から子供へのパスを取得できます。

アップデート: :OK、隣接リストモデルを使用するので、テーブルにノードレベルを保存することをお勧めします。 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 ;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top