2017-08-24 47 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