计算深入父母-孩子模型在MySQL
-
20-09-2019 - |
题
我怎么计算出一个节点的深度在父母-子模型下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 ;
不隶属于 StackOverflow