mysql - 带循环计数器的递归查询

标签 mysql select recursion

在 MySQL 中,我有以下 object 表:

| id | parent_id | name |
|---:|----------:|:-----|
|  1 |      NULL | root |
|  2 |         9 | obj1 |
|  3 |        10 | obj2 |
|  4 |         7 | obj3 |
|  5 |         8 | obj4 |
|  6 |         4 | obj5 |
|  7 |         2 | obj6 |
|  8 |         3 | obj7 |
|  9 |         1 | obj8 |
| 10 |         1 | obj9 |

以及以下查询以获取从我的元素 (id 6) 到根目录的路径:

SELECT  @id :=
        (
        SELECT  parent_id
        FROM    object
        WHERE   id = @id
        ) AS tree
FROM    (
        SELECT  @id := 6
        ) a
STRAIGHT_JOIN object
WHERE   @id IS NOT NULL

结果是:

| tree |
|-----:|
|    4 |
|    7 |
|    2 |
|    9 |
|    1 |
| NULL |

但我需要在结果中有一个计数器,它表示通过路径的遍历(就像 for 循环中的一个计数器):

| tree | ctr |
|-----:|----:|
|    4 |   1 |
|    7 |   2 |
|    2 |   3 |
|    9 |   4 |
|    1 |   5 |
| NULL |   6 |

是否可以添加计数器,如何添加?

最佳答案

我不确定您的查询是否保证有效,但它可能(在 straight join 和子查询之间,执行顺序可能得到保证)。您可以使用另一个变量来获取计数器:

SELECT  @id := (SELECT parent_id
                FROM object
                WHERE id = @id
               ) AS tree,
        (@rn := @rn + 1) as ctr
FROM (SELECT  @id := 6, @rn := 0) a STRAIGHT_JOIN
     object
WHERE @id IS NOT NULL;

关于mysql - 带循环计数器的递归查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35917383/

相关文章:

mysql - 为什么我看到 "COLLATION ' xxx' is not valid for CHARACTER SET 'yyy' "

sql - 如何获取sql server中某列的运行总和

mysql: 0 而不是空表

python - 动态继承功能

c++ - 任何人都可以向我解释这个输出吗?

PHP 添加 html 标签白名单以清理输入

php - 动态插入php mysql和性能

mysql - 如何把这个mysql select 改成sql server select 语句?

Python 递归 : nested list from flat list

javascript - 仅将 Json 数组中的一定数量的行输出到 HTML 表