在链中选择所有具有参考ID的查询

时间:2019-02-05 13:01:02

标签: mysql sql mariadb

我有这张表,我想存储一条记录链。

CREATE TABLE table_name (
    id INT,
    unique_id varchar,
    reference_id varchar,
);

我想为MariDB实现SQL查询,该查询按id打印所有记录以及带有reference_id的所有记录。像这样:

| id | unique_id | reference_id |   |   |
|----|-----------|--------------|---|---|
| 43 | 55544     |              |   |   |
| 45 | 45454     | 43           |   |   |
| 66 | 55655     | 45           |   |   |
| 78 | 88877     | 66           |   |   |
| 99 | 454       | 33           |   |   |

当我选择记录66进行所有向上和向下交易时,我想要,因为彼此都使用指向它们的id。如何使用递归CTE来实现?有更好的方法吗?

具有唯一ID 66的记录的预期结果:

| id | unique_id | reference_id |   |   |
|----|-----------|--------------|---|---|
| 43 | 55544     |              |   |   |
| 45 | 45454     | 43           |   |   |
| 66 | 55655     | 45           |   |   |
| 78 | 88877     | 66           |   |   |

我尝试过,但是上面的行没有打印。

select @ref:=id as id, unique_id, reference_id
from mytable
join (select @ref:=id from mytable WHERE reference_id=@ref or id = 66)tmp
where reference_id=@ref

Demo on DB Fiddle

您能帮我找到解决方法吗?

编辑:尝试使用CTE:

with recursive cte as (
      select t.*
      from mytable
      where t.id = 66
      union all
      select t.*
      from cte join
           mytable t
           on cte.id = t.reference_id
     )
select *
from cte;

我收到错误Unknown table 't'

1 个答案:

答案 0 :(得分:1)

我不熟悉递归CTE。您可以尝试以下查询。

select t.id, t.unique_id, @uid := t.reference_id reference_id
from (select * from mytable order by id desc) t
join (select @uid := 66) tmp
where t.id = @uid or reference_id=66