2014-12-20 53 views
1

我想要從樹的根節點獲取路徑。這是我的例如樹:用純MySQL獲取樹的根路徑

id | name | parent_id 
------------------------------ 
1 | mike | 0 
2 | danny | 1 
3 | peter | 1 
4 | clark | 2 
5 | lily | 1 
6 | stefan | 3 
7 | simon | 3 
8 | boby | 1 
9 | john | 4 
10 | elly | 4 

我寫PHP與MySQL的algoritm但慢慢

public function GetRootPath($a_id) { 
    $root=""; 
    $results=""; 
    while(1==1){ 
     $result = DB::select("SELECT id, parent_id FROM users WHERE id=$a_id"); 
     if($result[0]->refr!=0) { 
       if($root==""){ 
        $root=$result[0]->parent_id; 
       } 
       else { 
        $root=$result[0]->parent_id.'.'.$root; 
       } 
      $a_id=$result[0]->parent_id; 
     } 
     else { 
      break; 
     } 
    } 
    return $root; 
} 

怎麼會這樣在單純的MySQL寫?我不太瞭解MySQL的程序和功能。

+0

可能切換到一組嵌套 – Strawberry

+0

組嵌套有利於與固定深度樹,礦山是非常動態的(查詢系統)。 – vinsa

+0

爲什麼嵌套集合適用於固定深度的樹木?我會認爲相反的是真的!?!?! – Strawberry

回答

1

我認爲存儲過程可以工作:

DELIMITER $$ 

DROP PROCEDURE IF EXISTS get_root; 
CREATE PROCEDURE get_root(
    IN parentID INT, 
    OUT rootID INT 
) 

BEGIN 
    SELECT parent_id FROM tree WHERE id = parentID INTO rootID; 

    IF rootID = 0 
     THEN SET rootID = parentID; 
    ELSE 
     CALL get_root(rootID, rootID); 
    END IF; 

END$$ 
DELIMITER ; 

SET @@GLOBAL.max_sp_recursion_depth = 255; 
SET @@session.max_sp_recursion_depth = 255; 

CALL get_root(4, @rootID); 
SELECT @rootID; 
+0

它正在修正一些問題,'DROP PROCEDURE IF EXISTS get_root;'必須在'DELIMITER $$'之前,這個MySQL語言是個婊子。一個問題 - 爲什麼你要設置@@ GLOBAL和@@ session max_sp_recursion_depth,有什麼不同,是不是@@ session還不夠? – vinsa

+0

事實是,當我看到你的問題時,我不知道答案,但對我來說似乎很有趣,我試圖解決它。 因此,做一些研究,我已經得到了這個答案。確實,使用@@會話可能就足夠了,但我認爲那個過程只能在同一個會話中工作。如果你想在任何會議上打電話,我認爲你應該使用@@ GLOBAL – Noogic