2010-09-26 265 views
3

我不完全確定我在說這個權利,但請耐心等待。SQL樹遍歷

我想知道是否可以做這樣的事情在SQL(MySQL的具體): 比方說,我們有在下表中堅持在數據庫樹狀數據:

mysql> desc data_table; 
    +------------------------+---------------------+------+-----+---------+----------------+ 
    | Field     | Type    | Null | Key | Default | Extra   | 
    +------------------------+---------------------+------+-----+---------+----------------+ 
    | id      | int(10) unsigned | NO | PRI | NULL | auto_increment | 
    | parent_id    | int(10) unsigned | YES | MUL | NULL |    | 
    | value     | text    | YES |  | NULL |    | 

所以每行都有一個父級,除了「根」行以外,每行都有除葉行以外的子級。

是否有可能找到所有使用SQL的給定行的所有後代?

回答

8

可以僅使用SQL獲取所有後代,但不能在單個查詢中獲取。但我相信你明白了這一點;我假設你的意思是你想在單個查詢中完成它。

您可能有興趣閱讀一些用於存儲樹結構的替代設計,這些設計使您可以使用單個SQL查詢獲取所有後代。看到我的介紹Models for Hierarchical Data with SQL and PHP

您還可以對其他品牌的數據庫(例如PostgreSQL)使用遞歸SQL查詢,但MySQL目前不支持此功能。

+0

+1:很好的演示文稿,我會在接下來的一兩個月內使用! – 2010-09-27 00:54:30

0

您可能更喜歡使用嵌套集合模型(請參閱http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ - 進一步下載)。它的選擇效率更高,您可以通過簡單的自連接獲得每個節點的完整路徑。 但是,實際上,如果您希望執行諸如「where depth = 3」之類的操作,並且希望顯示多個節點的完整路徑(如果表中的記錄超過1000條),則預先緩存路徑和深度。