使用纯MySQL获取树的根路径

时间:2014-12-20 11:25:04

标签: mysql path tree root

我想从树的节点到根节点获取路径。这是我的树,例如:

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的程序和功能不是很了解。

1 个答案:

答案 0 :(得分: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;