2010-07-18 69 views
9

我有如下表:遞歸查詢自己

myTable: 
+----+----------+ 
| id | parentID | 
+----+----------+ 
| 1 |  null | 
| 2 |  1 | 
| 3 |  1 | 
| 4 |  2 | 
| 5 |  4 | 
----------------- 

我想獲得追溯,直到沒有了的parentID所有行。 所以」 ...... WHERE ID = 5"會給我:

5, 4, 2, 1 
+4

Bill Karwin創建了一些很好的關於hierchical數據的解釋,以及如何使用不同的解決方案:http://www.slideshare.net/billkarwin/models-for-hierarchical-data – Wrikken 2010-07-18 15:42:45

+0

MySQL沒有遞歸CTE,所以我認爲如果需要處理任意深度,這將需要一個遊標。正在改變結構http://dev.mysql.com/tech-resources/articles/hierarchical-data.html一個選項?或者我們可以假設一些最大深度?也看到這個相關的問題http://stackoverflow.com/questions/169817/is-it-possible-to-query-a-tree-structure-table-in-mysql-in-a-single-query-to-any – 2010-07-18 15:59:14

+0

Bill Karwin的幻燈片真的很酷。 – iddqd 2010-07-24 11:27:26

回答

9

您正在使用adjacency list model組織您的分層數據。這種遞歸操作很困難的事實實際上是這種模型的一個主要缺點。

某些DBMS(如SQL Server 2005,Postgres 8.4和Oracle 11g)支持使用common table expressionsWITH關鍵字的遞歸查詢。

至於MySQL,你可能有興趣在檢查出下面的文章描述了另一種模式(在nested set model),這使得遞歸操作容易(可能):

另外,我還建議查看上面評論中指出的Bill Karwin's presentation。所描述的封閉表模型是嵌套集的非常有效的替代方案。

+0

好的,非常感謝您的鏈接和評論,我現在明白了。 由於我不假設樹非常深,我只需要這個很少,我決定只做兩個自連接,如果parentID仍然不是NULL,我再次運行查詢。 – iddqd 2010-07-19 08:16:48

+0

@iddqd:是的,這是可行的。但正如你所看到的那樣,這是這種模式的侷限性。 thx。絕對, – 2010-07-19 08:19:31

+0

。 – iddqd 2010-07-19 12:25:54