我有一张包含人口统计数据的员工表。该表有两个我需要的字段:员工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。
答案 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;