循环计数器的递归查询

时间:2016-03-10 13:05:32

标签: 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 |

以下Query用于获取从我的元素(id 6)到root的路径:

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 |

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

1 个答案:

答案 0 :(得分:1)

我不确定您的查询是否可以保证有效,但它可能(在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;