我怎么计算出一个节点的深度在父母-子模型下MySQL?

我需要的深度,除其他事项外,创建缩进在我的名单(编码与PHP)。

有帮助吗?

解决方案 2

这可能是一个老问题,但我只是不想让别人知道,我找到了一个解决方案几个月前。我最近写在这里:的http:// EN。 someotherdeveloper.com/articles/adjacency-list-model-with-depth-calculation/

其他提示

这取决于实际执行的层次结构的数据库。如果你用套套模型(http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/)可检索完整的父母对孩子的路径通过一个单一的选择。

更新:好吧,因为你要和邻接表模型表明储存节点的水平。它不仅会给你点的深度在一种查询,但它还会让你检索整个路径,节点在一个查询(尽管这一查询将不得动态生成的):

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的Fileds表项目。

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