Getting hierarchy data from self-referencing tables

前端 未结 5 1551
孤独总比滥情好
孤独总比滥情好 2020-12-13 15:00

Let\'s say you have the following table:

items(item_id, item_parent)  

... and it is a self-referencing table - item_parent r

相关标签:
5条回答
  • 2020-12-13 15:37

    I need to find a solution for the same task, found some articles, but still didn't choose which way to go...

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

    May be these links might help you. If you find a good solution - please post it here. i'm not allowed to post more then 1 link - i will add some to next posts

    0 讨论(0)
  • 2020-12-13 15:38

    Oracle has a very convenient syntax for retrieving hierarchical data like this:

    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)
    

    This starts with the root nodes of your trees as those items whose item_parent does not exist in the table as item_id, and selects all children of those nodes, along with their depth in the tree.

    0 讨论(0)
  • 2020-12-13 15:41

    There is a good tech article on the mysql website about hierarchical data in MySql: Managing Hierarchical Data in MySQL - you can find a few detailed solutions with pro and cons there.

    Especially the part about "The Nested Set Model" and "Finding the Depth of the Nodes" should be of interest for you.

    0 讨论(0)
  • 2020-12-13 15:51

    MySQL

    • http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html
    • http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

    EDIT: removed unnecessary information

    0 讨论(0)
  • 2020-12-13 15:55

    If the database is SQL 2005 / 2008 then...

    The easiest way to get this is using a CTE (Common Table Expression) that is designed to recurse.

     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
    

    The output is as follows:

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

    From that you can format it as you wish.

    0 讨论(0)
提交回复
热议问题