我想从树的节点到根节点获取路径。这是我的树,例如:
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 :(得分: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;