如何在MySQL

时间:2015-09-22 15:37:29

标签: mysql loops recursion

我有一张包含人口统计数据的员工表。该表有两个我需要的字段:员工ID和经理ID。我需要构建一个如下所示的连接表:

员工ID 经理ID

1 2
1 3
1 4
2 3
2 4

所以我需要联接表为每位员工展示他们上面的所有人。如果是员工1,他的直接经理是2,经理的经理是3,经理的经理是4。

我有一个MySQL程序,在为员工打电话时似乎正在运作:

CREATE PROCEDURE chainReaction (IN employee_id int, IN orig_id int)
BEGIN
    DECLARE manager_id int default NULL;
    SET @@SESSION.max_sp_recursion_depth = 255;
    SELECT ManagerID 
    INTO manager_id 
    FROM employees
    WHERE EmployeeID = employee_id;
    IF( manager_id is not null) THEN
        INSERT INTO joinTable(EmpID, SupID) VALUES(
            orig_id,manager_id
        );
        CALL chainReaction(manager_id, orig_id);
  end if;
END;

问题1: 调用chainReaction时,看起来我需要为过程提供两次员工ID,否则原始员工ID将“丢失”,而员工1的结果插入如下所示:

员工ID 经理ID

1 2
2 3
4 4

因此,在我需要时,员工ID不会固定为1。同样,此过程在现在调用时起作用:chainReaction(1,1);

但问题2:

我有一些代码循环遍历employee表中的所有行,并在它们上调用chainReaction:

CREATE PROCEDURE RowPerRow ()
BEGIN
    DECLARE n int default 0;
    DECLARE i int default 0;
    DECLARE employee_id int default null;
    SELECT COUNT(*) FROM employees INTO n;
    SET i=0;
    WHILE i<n DO
        SELECT EmployeeID FROM employees WHERE LIMIT i,1 INTO employee_id;
        CALL chainReaction(employee_id,employee_id);
    END WHILE;
END;

问题在于,如果我调用此RowPerRow()过程,无论正在处理哪一行,连接表中的employee列都会粘贴到第一个员工ID。

1 个答案:

答案 0 :(得分:0)

看起来我的程序运行得很好,我在RowPerRow过程中缺少的是递增计数器(SET i = i + 1;)。这是修复后的代码。

CREATE PROCEDURE RowPerRow ()
BEGIN
    DECLARE n int default 0;
    DECLARE i int default 0;
    DECLARE employee_id int default null;
    SELECT COUNT(*) FROM employees INTO n;
    SET i=0;
    WHILE i<n DO
        SELECT EmployeeID FROM employees WHERE LIMIT i,1 INTO employee_id;
        CALL chainReaction(employee_id,employee_id);
        SET i = i + 1;
    END WHILE;
END;