从感兴趣节点到根节点的mysql递归查询

Posted

技术标签:

【中文标题】从感兴趣节点到根节点的mysql递归查询【英文标题】:mysql recursive query from node of interest to root node 【发布时间】:2020-03-20 09:02:12 【问题描述】:

我有一个mysql表如下:

id | name        | parent_id
19 | category1   | NULL
20 | category2   | 19
21 | category3   | 20
22 | category4   | 21

我如何编写一个递归 mysql 查询来获取从输入节点到根节点的所有节点。 例如:如果输入是category3,输出应该是category3、category2和category1

【问题讨论】:

【参考方案1】:

我们可以尝试使用以下递归分层查询:

WITH RECURSIVE cte (id, name, parent_id) AS (
    SELECT     id,
               name,
               parent_id
    FROM       yourTable
    WHERE      parent_id IS NULL
    UNION ALL
    SELECT     p.id,
               p.name,
               p.parent_id
    FROM       yourTable p
    INNER JOIN cte
            ON p.parent_id = cte.id
    WHERE      cte.name <> 'category3'
)

SELECT GROUP_CONCAT(name ORDER BY id DESC) AS names FROM cte;

这个输出:

category3,category2,category1

Demo

这里的想法是短路递归以停止在父级为category3 的点。如果 CTE 的递归部分达到这一点,则意味着它已经 低于category3 级别,因此应该停止。

【讨论】:

以上是关于从感兴趣节点到根节点的mysql递归查询的主要内容,如果未能解决你的问题,请参考以下文章

mysql如何递归汇总?

200分求助!SQL递归查询所有子节点

使用MySQL 8的递归CTE遍历树

使用MySQL 8的递归CTE遍历树

java 找到一节点的所有子节点 是否得递归实现?

mysql查询一个表,实现递归查询