在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 |
是否可以添加计数器以及如何添加?
答案 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;