如何在MySQL表中递归选择所有父项?

时间:2018-03-20 19:18:10

标签: mysql sql

如何在MySQL表中递归选择所有父项?

结构是这样的:

id   name      parent_id
-----------------------
1    namelvl1  null
2    namelvl2  1
3    namelvl3  2

依旧......

如何获取id = 3的所有父母的列表?

1 个答案:

答案 0 :(得分:1)

<强> 1。效率低下的解决方案

以下解决方案有效,但在效率方面却很糟糕。它总是读取表格的所有行(即使你只需要三行),然后排除你不需要的那些行。 它改编自article

SELECT  @r AS _id,
         (
         SELECT  @r := parent_id
         FROM    my_table
         WHERE   id = _id
         ) AS parent,
         @l := @l + 1 AS lvl
 FROM    (
         SELECT  @r := 3, -- starting node = 3
                 @l := 0,
                 @cl := 0
         ) vars,
         my_table h
WHERE    @r <> 0

我能说什么......它有效。问题是它只是在桌子上进行全表扫描。如果桌子很大,这可能会非常昂贵。

<强> 2。标准分层查询

从版本8.0开始MySQL(未发布为稳定版)正式支持根据SQL标准进行分层查询。

如果您可以升级到8.0版,则可以运行常规的分层查询。

第3。使用MariaDB

现在,如果您可以使用MariaDB(最初是MySQL的克隆),则从版本10.2.2开始使用标准SQL已经可以使用分层查询。