【问题标题】:MySQL Recursive Procedure to Select Multiple RowsMySQL递归过程选择多行
【发布时间】: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 ;

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

【问题讨论】:

标签: mysql recursion stored-procedures


【解决方案1】:

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

  1. 创建包含所需最终数据字段的临时表,以及 “迭代”字段
  2. 将迭代设置为 0
  3. 将“根节点”的数据添加到临时表进行迭代。
  4. 增量迭代
  5. 将数据从源表中的上一次迭代的插入行中的父表插入临时表。
  6. 如果插入行,转到 4;否则停止迭代。
  7. 从临时表中选择数据(不包括迭代 0,除非您希望包含“根节点”和迭代列)
  8. 删除临时表

棘手的部分:MySQL 对 TEMPORARY 表的使用方式可能很挑剔,因此您实际上可能需要两个;一个用于累积数据,另一个用于保存当前迭代的数据。您可以使用非 TEMPORARY 表,但是您会遇到并发调用此过程冲突的问题。

【讨论】:

    猜你喜欢
    • 2013-01-17
    • 2014-01-29
    • 2023-04-10
    • 2011-05-19
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多