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

时间:2010-02-04 13:26:35

标签: mysql sql recursion hierarchy

假设您有下表:

items(item_id, item_parent)  

...这是一个自引用表 - item_parent引用item_id

您将使用什么SQL查询来选择表格中的所有项目及其深度,其中项目的深度是该项目的所有父项和祖父项的总和。

如果以下是表格的内容:

item_id     item_parent
----------- -----------
1           0          
2           0            
3           2          
4           2          
5           3          

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

{ “ITEM_ID”:1, “深度”:0}
{ “ITEM_ID”:2 “深度”:0}
{ “ITEM_ID”:3, “深度”:1}
{ “ITEM_ID”:4, “深度”:1}
{“item_id”:5,“深度”:2}

P.S。我正在寻找MySQL支持的方法。

5 个答案:

答案 0 :(得分:22)

如果数据库是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

输出如下:

Item_Id  Depth
    1   0
    2   0
    3   1
    4   1
    5   2

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

答案 1 :(得分:4)

在mysql网站上有一篇关于MySql中分层数据的好文章: Managing Hierarchical Data in MySQL - 您可以在那里找到一些有利可图的详细解决方案。

特别是关于“嵌套集模型”和“寻找节点深度”的部分应该引起您的兴趣。

答案 2 :(得分:3)

Oracle有一种非常方便的语法来检索这样的分层数据:

select
    item_id,
    item_parent,
    level as depth
from
    items
connect by
    prior item_id = item_parent
start with
    item_parent not in (select item_id from items)

这从树的根节点开始,作为其item_parent在表中不存在的项目item_id,并选择这些节点的所有子节点及其在树中的深度。

答案 3 :(得分:2)

答案 4 :(得分:0)

我需要为同一个任务找到一个解决方案,找到一些文章,但仍然没有选择走哪条路......

http://explainextended.com/2009/07/20/hierarchical-data-in-mysql-parents-and-children-in-one-query/

可能这些链接可能对您有所帮助。如果您找到了一个好的解决方案 - 请在此处发布。我不允许发布超过1个链接 - 我将在下一个帖子中添加一些