2010-09-13 132 views
2

我有一組分層次組織的數據,應該能夠增長到任意大小。我需要檢索整個樹,但我無法弄清楚如何用SQL來完成。我目前的解決方案是創建一個臨時表並使用遞歸函數連續查詢樹的分支,然後將結果存儲在臨時表中,隨後我再次查詢以產生我想要的結果。遞歸MySQL查詢?

我的問題是,我在做什麼基本上是什麼一個連接不正確?構建一箇中間表,然後查詢結果。似乎應該有一種方法來處理連接,但MySQL文檔僅涵蓋檢索樹的部分,直到有限的深度。有沒有辦法做到這一點?我在PHP中這樣做。

+0

MySQL沒有分層/遞歸查詢支持。 – 2010-09-13 20:32:51

+0

類似的問題我問,可能會有一些幫助:http://stackoverflow.com/questions/2352543/implementing-recursive-comments-in-php-mysql – GSto 2010-09-13 20:39:00

回答

15

MySQL不支持遞歸查詢。

我建議你看看比爾Karwin的presentation他比較了四種不同的型號,用於存儲heirarchical數據,並着眼於他們的優點和缺點:

  • 鄰接表
  • 路徑枚舉
  • 嵌套集合
  • 關閉表

幻燈片48顯示了相對每個模型的某些類型的查詢都很困難。從你的問題來看,這聽起來像你最感興趣的是「查詢子樹」,對此,鄰接列表(你當前使用的模型)在四個中表現最差。

或者,如果您只想選擇整個樹(如表中的所有數據),則可以使用簡單查詢SELECT * FROM yourtable並重新構建客戶端中的樹結構。

+1

Karwin的* SQL反模式*書是一個很好的閱讀關於這種的東西。 – 2010-09-13 20:39:49

+0

謝謝,這是一個偉大的閱讀。嵌套集最終成爲理想的解決方案,儘管它在某種程度上使SQL複雜化了。 – 2010-09-20 05:01:30

+0

此外,我曾想過抓住整個桌子,但我需要能夠抓住特定的分支。 – 2010-09-20 05:01:50

1

需要更多的數據..表只表示一棵樹或多棵樹嗎?如果它是一棵樹,則可以從表中選擇所有內容,然後在內存中構建樹結構。如果它是多個樹,則可以考慮爲每個樹元素添加一個treeID來表示該元素所屬的樹。

如果您正在尋找選擇樹的分支,您可以考慮使用順序整數「排序等級」存儲元素並鏈接到左右節點,然後選擇最左節點的整數範圍內的所有節點和最右邊的節點。

查找鄰接列表以獲取有關此存儲模型的更多信息。您還可以創建一個混合鄰接列表/父節點鏈接,因爲數據存儲是如此便宜,但您可能有更多開銷保持排序鏈接更新...