mysql - MYSQL中递归存储过程获取分层数据的表现

标签 mysql

我有表员工,
员工 ( emp_id int 主键, emp_name varchar(50), mngr_id 整数)

这里的 mngr_id 要么为空,要么包含有效的 emp_id。这样就形成了组织中员工的层次结构。

为了遍历整个层次结构,我不得不编写递归存储过程。 (在 Oracle 中,使用 CONNECT BY .. START WITH 很容易)

所以问题是,在层次结构级别不会超过 10 级的情况下,这种存储过程的性能影响是什么!

还有其他方法可以实现吗?

最佳答案

一个相当简单的迭代邻接表数据库服务器端解决方案:http://pastie.org/1056977

delimiter ;

drop procedure if exists employee_hier;

delimiter #

create procedure employee_hier
(
in p_emp_id smallint unsigned
)
begin

declare p_done tinyint unsigned default(0);
declare p_depth smallint unsigned default(0);

create temporary table hier(
 boss_id smallint unsigned, 
 emp_id smallint unsigned, 
 depth smallint unsigned
)engine = memory;

insert into hier values (null, p_emp_id, p_depth);

/* http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html */

create temporary table emps engine=memory select * from hier;

while p_done <> 1 do

    if exists( select 1 from employee e inner join hier on e.boss_id = hier.emp_id and hier.depth = p_depth) then

        insert into hier select e.boss_id, e.emp_id, p_depth + 1 
            from employee e inner join emps on e.boss_id = emps.emp_id and emps.depth = p_depth;

        set p_depth = p_depth + 1;          

        truncate table emps;
        insert into emps select * from hier where depth = p_depth;

    else
        set p_done = 1;
    end if;

end while;

select 
 e.emp_id,
 e.name as emp_name,
 b.emp_id as boss_emp_id,
 b.name as boss_name,
 hier.depth
from 
 hier
inner join employee e on hier.emp_id = e.emp_id
inner join employee b on hier.boss_id = b.emp_id;

drop temporary table if exists hier;
drop temporary table if exists emps;

end #

delimiter ;


call employee_hier(1);
call employee_hier(3);

关于mysql - MYSQL中递归存储过程获取分层数据的表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/221194/

相关文章:

mysql - 如何查找当前日期介于 Fromdate 和 todate 之间

php - mysql_real_escape_string() 会取消 stripslashes() 吗?

php - 折扣组合表

php - 一次更新多个 MySQL 行

php - MySql 数据库真的有一些限制吗?

php - NULL MySQL 到 PHP PDO

java - 我们如何在 Spring Boot 中连接 MySql 数据库?

mysql - 在mysql中选择随机行

mysql - 将两列排序为一列

mysql - MySQL 中的 CHECK 约束不起作用