SQL / MySQL以递归方式从同一个表中提取

时间:2017-08-24 15:59:41

标签: mysql sql recursion logic

这个问题很奇怪,我想我只是想到这个错误。我试图(递归地)获得与给定承包商相关联的所有页面URL。三个相关表格是:

|-------------------------------------------------|
|                 client_sections                 |
|-------------------------------------------------|
|    contractor_id    |    reusable_section_id    |
|-------------------------------------------------|

|--------------------------------------------------------|
|                     reusable_sections                  |
|--------------------------------------------------------|
|    reusable_category_id    |    reusable_section_id    |
|--------------------------------------------------------|

|--------------------------------------------|
|             reusable_content               |
|--------------------------------------------|
|    reusable_section_id    |    page_url    |
|--------------------------------------------|

现在需要 - 第一个查询是

SELECT reusable_section_id FROM client_sections where contractor_id = '119'

这将获得所有顶级"父级" - 表reusable_category_id中的reusable_sections。如果我不得不停在那里,我会把它处理掉。但我遇到的警告是,每个返回的部分"可以"也是一个部分。我尝试过嵌套的SELECT,结果简直就是灾难性的!

我在尝试什么:

» Get contractor parent sections by contractor ID from client_sections table

    » get sections by reusable_category_id = reusable_section_id in reusable_sections  -- 

        » get page_url for all the sections returned (including the initial parents) 
          by reusable_section_id in reusable_content  -- I am good until this point

            » recur the last two steps with the current reusable_section_id as 
              reusable_category_id to check for children  (!!#$@#!!!)

                » Finally return all pages for all sections under that contractor_id 

我尝试过的搜索范围从疯狂的JOINS到嵌套的SELECT都无济于事。我看了很多帖子,包括This One。我是一个称职的SQL开发人员,我认为我的逻辑是有缺陷的,正确方向的简单点可能只会激发我的创造力!是WHILE循环的最佳方式吗?嵌套SELECTJOIN?我的大脑被炒了!帮助

1 个答案:

答案 0 :(得分:1)

你有什么看起来像一棵树。如果你在谈论有限数量的导航,那么有限数量的左外连接就足够了。

但是,如果您有无限多个可能的级别,我认为您不能使用普通的旧SQL和连接来解决您的问题。

您将不得不求助于存储过程或编程语言(php,java等)。

但是,似乎人们已经实现了如何遍历树的存储过程,因此您可以通过这种方法。 例如:

Using MySQL query to traverse rows to make a recursive tree