gpt4 book ai didi

mysql - 如何在 MySQL 的循环中使用递归过程

转载 作者:可可西里 更新时间:2023-11-01 09:04:53 25 4
gpt4 key购买 nike

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

我有一些代码可以遍历员工表中的所有行并对它们调用 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() 过程,无论正在处理哪一行,连接表中的员工列都会固定为第一个员工 ID。

最佳答案

看起来我的程序工作得很好,我在 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;

关于mysql - 如何在 MySQL 的循环中使用递归过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32721121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com