从自引用表中获取层次结构数据

Ema*_*sev 22 mysql sql recursion hierarchy

假设你有下表:

items(item_id, item_parent)  
Run Code Online (Sandbox Code Playgroud)

......它是一个自引用表 - item_parent指的是item_id.

您将使用什么SQL查询来选择表中的所有项以及它们的深度,其中项的深度是该项的所有父项和父项的总和.

如果以下是表的内容:

item_id     item_parent
----------- -----------
1           0          
2           0            
3           2          
4           2          
5           3          
Run Code Online (Sandbox Code Playgroud)

...查询应检索以下对象集:

{"item_id":1,"深度":0}
{"item_id":2,"深度":0}
{"item_id":3,"深度":1}
{"item_id":4,"深度": 1}
{"item_id":5,"深度":2}

PS我正在寻找MySQL支持的方法.

And*_*rew 23

如果数据库是SQL 2005/2008那么......

获得此功能的最简单方法是使用旨在递归的CTE(公用表表达式).

 WITH myCTE (Item_id, Depth)
 AS
 (
    Select Item_ID, 0 as Depth From yourTable where Item_Parent=0
    Union ALL
    Select yourTable.Item_ID, Depth + 1 
    From yourTable 
    inner join myCte on yourTable.item_Parent = myCte.Item_Id
 )

 Select Item_id, Depth from myCTE
Run Code Online (Sandbox Code Playgroud)

输出如下:

Item_Id  Depth
    1   0
    2   0
    3   1
    4   1
    5   2
Run Code Online (Sandbox Code Playgroud)

您可以根据需要对其进行格式化.


Fra*_*nkS 5

mysql网站上有一篇很好的技术文章,内容涉及MySql中的 层次结构数据:在MySQL中管理层次结构数据 -您可以在此处找到一些具有优缺点的详细解决方案。

尤其是有关“嵌套集模型”和“查找节点深度”的部分。