为 MariaDB 的分层查询实现递归 CTE

Implement Recursive CTE for Hierarchical Query to MariaDB

我有这个table,我想存储一个记录链。

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

我想为 MariDB 实现 SQL 查询,它打印 unique_id 的所有记录和所有记录 reference_id。像这样:

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

我想当我 select 记录 55544 时获取所有交易,因为彼此都在使用指向它们的 id。我如何使用递归 CTE 实现它?有没有更好的方法?

unique_id 55544 记录的预期结果:

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

如何在 HQL 中也实现此查询?我想在 JPA 中使用它?

以下查询应该符合您的预期。这是一个递归查询,它依赖于一个变量来通过依赖树跟踪父子关系。

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

demo on DB Fiddle 产生:

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

PS :请​​注意,这不是 return 最上面的父行。如果您也需要它,可以将 WHERE 条件更改为 :

where reference_id=@ref or unique_id = 55544

您可以使用递归 CTE。这是执行此操作的正确方法:

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