MySQL 5.7 对具有未知级别的层次结构数据的递归查询

Posted

技术标签:

【中文标题】MySQL 5.7 对具有未知级别的层次结构数据的递归查询【英文标题】:MySQL 5.7 recursive query on hierarchy data with unknown levels 【发布时间】:2021-10-03 00:02:01 【问题描述】:

我正在开发一个层次结构数据结构,我想在其中执行递归以获得所需的输出

 id       role_id      reporting_to
 ------+-------------+-----------------
1          100             101
1          101             102
1          102             103
1          103             104

如果我将103 作为输入角色,我想得到以下输出

  id    role_id      reporting_to
-----------+-------------+-----------------
    1          100             101
    1          101             102
    1          102             103

输出应该是从输入到最后一个孩子。试过下面的例子,但它没有返回正确的输出

select id,role_id,reporting_to
from (select * from role_mapping order by reporting_to,id) rm_sorted,
     (select @r:='103') initialisation
where find_in_set(reporting_to, @r)
and length(@r := concat(@r, ',', role_id))

【问题讨论】:

一般来说这不能作为查询来解决(或者它需要在一些数据限制,例如CHECK role_id < reporting_to约束)。使用迭代存储过程。 dbfiddle.uk/… 您需要的递归深度是否有一些(小)限制?如果没有,您将需要使用存储过程(或者只是升级到 mysql 8 或 mariadb) 正如其他人所提到的,5.7 中的邻接表模型自然不适合递归。考虑升级或切换到嵌套集模型。 我认为只有迭代方法是可能的。谢谢大家。 【参考方案1】:

除非你使用函数,否则mysql5.7永远不能进行递归查询。

也可以使用其他有递归的语言,如mysql5.8、oracle、java等,生成路径列,像这样(假设104为根节点)

id role_id reporting_to path
1 100 101 104/103/102/101/100
1 101 102 104/103/102/101
1 102 103 104/103/102
1 103 104 104/103

【讨论】:

以上是关于MySQL 5.7 对具有未知级别的层次结构数据的递归查询的主要内容,如果未能解决你的问题,请参考以下文章

层次结构和级别(Pentaho 模式工作台)?

用于编辑具有多级节点和多个用户的层次结构的架构

使用 sequelize 创建具有关联层次结构的对象

MySQL 5.7安装

具有多个属性层次结构的计算成员 - MDX

使用 MySQL 管理层次结构的数据