2017-08-24 17 views
0

这个问题是一个奇怪的问题,我想我只是想着这个错误。我试图(递归)获取与给定承包商关联的所有页面URL。这三个相关的表是:SQL/MySQL递归从同一张表中拉出

|-------------------------------------------------| 
|     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_idreusable_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 (!!#[email protected]#!!!) 

       » Finally return all pages for all sections under that contractor_id 

我试图查询从疯狂JOINS s到嵌套SELECT s到无济于事。我读过很多帖子,包括This One。我是一名有能力的SQL开发人员,我认为我的逻辑是有缺陷的,向正确方向发展的一个简单点可能会激发我的创造力! WHILE循环是最好的方法吗?嵌套0​​? JOIN?我的大脑被炸了!帮帮我?

+0

如何递归的多层次,你期待什么呢?如果您没有限制,则仅通过执行左外连接就无法解决此问题。你将需要一个存储过程,否则你将不得不使用编程语言来实现它。它基本上是一棵树。 –

+0

理论上它可能是无限的..这就是为什么递归让我难倒了......我可以用JOIN来完成,否则...... – Zak

+0

https://stackoverflow.com/questions/10646833/using-mysql-query-to-traverse-行 - 制作 - 递归 - 树:D。 看到这个:https://www.slideshare.net/billkarwin/models-for-hierarchical-data –

回答

1

你看起来像一棵树。如果您正在谈论通过有限数量的级别进行导航,那么有限数量的左外连接就足够了。但是,如果您拥有无限数量的可能级别,我不认为您可以使用普通的旧SQL和连接来解决您的问题。

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

但是,似乎人们已经实施了存储过程来关于如何遍历树,所以你可以通过这种方法。 例子:

Using MySQL query to traverse rows to make a recursive tree

+0

看起来像一个很好的阅读..我会研究这个! – Zak

+0

存储过程是诀窍...这是一个伟大的阅读..谢谢! – Zak