我正致力于在MySQL中编写一个递归存储过程,它将返回多行数据,即子项及其所有父项,祖父母等的数据。例如,如果我有下表(“family”) “):
+---------+------+------------+
| Status | Name | ParentName |
+---------+------+------------+
| healthy | A | NULL |
+---------+------+------------+
| healthy | B | NULL |
+---------+------+------------+
| healthy | C | A |
+---------+------+------------+
| healthy | D | C |
+---------+------+------------+
| healthy | E | B |
+---------+------+------------+
我在名字'D'上运行程序,它应该返回以下内容:
+---------+------+------------+
| Status | Name | ParentName |
+---------+------+------------+
| healthy | D | C |
+---------+------+------------+
| healthy | C | A |
+---------+------+------------+
| healthy | A | NULL |
+---------+------+------------+
目前,订购并不是很重要,我应该能够在以后解决这个问题。还值得注意的是,在某些情况下,父名称按字母顺序大于子表名称,而某些名称的父名称按字母顺序小于子表名称。我已经看到了这方面的解决方案,要求父母要比孩子少,但那些对我不起作用。如果我可以访问支持CTE的MySQL版本,这将非常容易,但不幸的是,这是不可能的。相反,我正在递归地使用存储过程来解决我的问题。我到目前为止的代码如下:
DELIMITER |
CREATE PROCEDURE getNextLevel( IN parent_name TEXT)
BEGIN
IF parent_name IS NOT NULL
SELECT Status, Name, ParentName
FROM families
WHERE ParentName = parent_name
UNION
CALL getNextLevel(ParentName);
-- This is the line that throws an error
END IF;
END |
DELIMITER ;
显然,它并不像那样递归地调用我的过程那么简单(或者我只是称错了)。任何人都可以提供我在这里需要做什么的见解,或者可能是我的问题的替代解决方案吗?
答案 0 :(得分:0)
无需递归...伪代码步骤
棘手的部分:MySQL可能对如何使用TEMPORARY表很挑剔,所以你实际上可能需要两个;一个用于累积数据,另一个用于保存当前迭代的数据。您可以使用非TEMPORARY表,但是您会遇到此过程冲突的并发调用问题。