用于选择多行的MySQL递归过程

时间:2017-06-16 19:49:15

标签: mysql recursion stored-procedures

我正致力于在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 ;

显然,它并不像那样递归地调用我的过程那么简单(或者我只是称错了)。任何人都可以提供我在这里需要做什么的见解,或者可能是我的问题的替代解决方案吗?

1 个答案:

答案 0 :(得分:0)

无需递归...伪代码步骤

  1. 创建临时表,其中包含您想要的最终数据的字段,以及 “迭代”字段
  2. 将迭代设置为0
  3. 将“根节点”的数据添加到临时表以进行迭代。
  4. 增量迭代
  5. 从源表中将数据插入临时表,其中父表在最后一次迭代的插入行中。
  6. 如果行插入,转到4;否则停止迭代。
  7. 从临时表中选择数据(不包括迭代0,除非你想要包含“根节点”和迭代列)
  8. drop temp table
  9. 棘手的部分:MySQL可能对如何使用TEMPORARY表很挑剔,所以你实际上可能需要两个;一个用于累积数据,另一个用于保存当前迭代的数据。您可以使用非TEMPORARY表,但是您会遇到此过程冲突的并发调用问题。