【问题标题】:how to make a tree in sql?如何在sql中制作一棵树?
【发布时间】:2016-08-31 08:50:07
【问题描述】:

如何在sql中做一棵树,什么时候可以这样出数据?

category_id |category_parent |category_code      |category_name        
------------|----------------|-------------------|---------------------
70          |0               |Vege               |Vegetable            
71          |0               |Frui               |Fruit                
72          |0               |Fish               |Fishery              
73          |71              |Butc               |Butchery             
74          |72              |Poul               |Poultry              
75          |73              |Dair               |Dairy                
76          |75              |Deli               |Delicatessen         
77          |75              |Frofod             |Frozen Food          
78          |76              |Foserv             |Food Service         
79          |77              |Pla Flo            |Plant & Flower       
80          |79              |ConFresh           |Consightment Fresh   
81          |79              |Café               |Café                 

【问题讨论】:

  • 欢迎来到 Stack Oveflow。请访问帮助中心并拨打tour 了解要询问的内容和方法。
  • Mysql没有递归函数。使用应用层编写递归函数,然后生成树。
  • stackoverflow.com/a/16808998/1531192 可能对你有用。
  • 假设category_parentcategory_id 的自引用外键,那么您已经描述的是一棵树。

标签: php mysql sql


【解决方案1】:

您要查找的是公用表表达式 (CTE)。 Here 是 CTE 的一个很好的例子。

所以你想要做的看起来像这样:

WITH Tree(child_category_id, child_name, child_category, parent_id, Parents)
AS
(
--1st level rows (parent)
    SELECT category_id, category_name, category_code, category_parent, CAST('' AS VARCHAR(MAX))
        FROM YourTable AS FirtGeneration
        WHERE category_parent = 0
    UNION ALL
--children 
    SELECT NextGeneration.category_id, NextGeneration.category_name, NextGeneration.category_code, Parent.child_category_id,
    CAST(CASE WHEN Parent.Parents = ''
        THEN(CAST(NextGeneration.category_parent AS VARCHAR(MAX)))
        ELSE(Parent.Parents + '.' + CAST(NextGeneration.category_parent AS VARCHAR(MAX)))
    END AS VARCHAR(MAX))
        FROM YourTable AS NextGeneration
        INNER JOIN Tree AS Parent ON NextGeneration.category_id = Parent.child_category_id    
)
SELECT *
    FROM Tree
--not needed here because you wont do that many recursions
--OPTION(MAXRECURSION 32767)

【讨论】:

    猜你喜欢
    • 2010-09-06
    • 2016-05-19
    • 2023-01-17
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 2023-01-03
    相关资源
    最近更新 更多