2009-07-28 51 views
2

如何在MySQL下的父親 - 孩子模型中計算節點的深度?在MySQL中計算父親 - 孩子模型的深度

我需要的深度,除其他外,在我的列表中創建縮進(用PHP編碼)。

+0

我剛纔看到您的其他問題回覆:在嵌套集模型的移動節點,它看起來就像你被賦予了一些非常矛盾的答案,所以我能理解你的挫折感:-)移動嵌套集模型的節點其實非常簡單(儘管取決於你的桌子尺寸,它可能很昂貴)。如果您對此感興趣,請告訴我,我可以在答案中加上解釋。 – ChssPly76 2009-07-28 19:16:01

+0

哈哈沒錯,我對此感到非常沮喪。我發現一個星期前我認爲應該可以工作的解決方案,但是還沒有實施。但是對於我的目的而言,嵌套集合效果不佳,因爲許多不同的用戶可能會有很多每日更新,這意味着表格中有許多行。 因此,我會給這個鄰接表模型一個鏡頭,它可以安全地移動一個節點。 *豎起大拇指* – Ivar 2009-07-28 19:50:11

+0

祝您好運。我已經更新了我的答案以反映鄰接列表模型。 – ChssPly76 2009-07-28 20:22:06

回答

1

這取決於您在數據庫中的層次結構的實際實施。如果您使用嵌套集模型(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上給出適當的索引時,這應該是相當快的。
這種方法的缺點是你必須在節點移動過程中更新節點級別,但這應該是相當直接和快速的,因爲你只會爲節點本身和它的子節點執行它 - 而不是大部分表,就像你使用嵌套集合一樣。

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 ;