分层表 - 如何获取项目的路径[MySQL中的链接列表]

Hra*_*ian 8 mysql sql linked-list hierarchical-data

我在MySQL中有一个分层表:parent每个项的id字段指向其父项的字段.对于每个项目,我可以使用此处描述查询获取所有父项的列表[无论深度] .随着GROUP_CONCAT我得到的完整路径作为一个字符串:

SELECT GROUP_CONCAT(_id SEPARATOR ' > ') FROM (
SELECT  @r AS _id,
         (
         SELECT  @r := parent
         FROM    t_hierarchy
         WHERE   id = _id
         ) AS parent,
         @l := @l + 1 AS lvl
 FROM    (
         SELECT  @r := 200,
                 @l := 0
         ) vars,
         t_hierarchy h
WHERE    @r <> 0
ORDER BY lvl DESC
) x
Run Code Online (Sandbox Code Playgroud)

只有当id项目的内容得到修复时,我才能完成这项工作[ 200在这种情况下].

我想对所有行执行相同操作:使用一个额外的字段(path)检索整个表,该字段将显示完整路径.我想到的唯一解决方案是将此查询包装在另一个select中,设置一个临时变量@id并在子查询中使用它.但它不起作用.我进入NULLpath现场.

SELECT @id := id, parent, (
    SELECT GROUP_CONCAT(_id SEPARATOR ' > ') FROM (
    SELECT  @r AS _id,
             (
             SELECT  @r := parent
             FROM    t_hierarchy
             WHERE   id = _id
             ) AS parent,
             @l := @l + 1 AS lvl
     FROM    (
             SELECT  @r := @id,
                     @l := 0
             ) vars,
             t_hierarchy h
    WHERE    @r <> 0
    ORDER BY lvl DESC
    ) x
) as path
 FROM t_hierarchy
Run Code Online (Sandbox Code Playgroud)

PS我知道我可以将路径存储在一个单独的字段中并在插入/更新时更新它们,但我需要一个基于链表技术的解决方案.

更新:我想看到将不使用递归或类似结构的解决方案forwhile.上述查找路径的方法不使用任何循环或函数.我想在同一个逻辑中找到一个解决方案.或者,如果不可能,请尝试解释原因!

小智 2

定义 getPath 函数并运行以下查询:

select id, parent, dbo.getPath(id) as path from t_hierarchy 
Run Code Online (Sandbox Code Playgroud)

定义 getPath 函数:

create function dbo.getPath( @id int)
returns varchar(400)
as
begin
declare @path varchar(400)
declare @term int
declare @parent varchar(100)
set @path = ''
set @term = 0
while ( @term <> 1 )
begin
   select @parent = parent from t_hierarchy where id = @id
   if ( @parent is null or @parent = '' or  @parent = @id )
        set @term = 1
   else
        set @path = @path + @parent   
   set @id = @parent     
end
return @path
end
Run Code Online (Sandbox Code Playgroud)