【发布时间】:2017-06-17 05:08:33
【问题描述】:
我正在努力在 MySQL 中编写一个递归存储过程,它将返回多行数据,即一个孩子及其所有父母、祖父母等的数据。例如,如果我有下表(“家庭"):
+---------+------+------------+
| 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 ;
显然,这并不像像那样递归地调用我的过程那么简单(或者我可能只是把它称为错误)。任何人都可以提供任何关于我需要在这里做什么的见解,或者可能是我的问题的替代解决方案吗?
【问题讨论】:
-
你不能使用像stackoverflow.com/a/1492446/4104224这样的存储过程
-
这可能是您正在寻找的:stackoverflow.com/questions/5291054/…。这个答案是专门从 MySQL 中的分层数据执行基于深度的递归。
标签: mysql recursion stored-procedures