2012-11-28 45 views
1

我正在尋找一個非遞歸解決方案來做一個MySQL查詢來選擇節點的所有葉子節點(子節點,孫子節點等),同時只知道節點的直接子節點是誰。有沒有什麼辦法讓我只用一個查詢來獲得一棵樹,而只知道父母的ID?

目前,我有如下表:

節點:

  • ID(INT)
  • 數據(VARCHAR)

關係:

  • parentId的(INT)
  • childID的(INT)
  • childNodeOrder(INT)

我有它的方式目前我只能選擇一個父節點的直接子節點(此例如讓父ID = 1):

SELECT * FROM Nodes n 
JOIN Relationships r ON r.childId = n.id 
WHERE r.parentId = 1 
ORDER BY r.childNodeOrder; 

有什麼辦法,我周圍容易改變這個數據庫使用遞歸調用(在我的服務器端代碼),並能夠獲得父級的所有後裔葉子?

我至今都看着像this one問題,這似乎是一個徹底的改變,而不是很容易切換...

+0

你爲什麼只在表格中存儲直接關係? – Esailija

+0

@Esailija這是我的問題,我該如何改變我的數據庫,使其對我需要做的更有用......? – Neal

+0

所以問題是,你知道你的桌子被擰了,需要知道如何將其轉換爲合適的閉合表格格式? – Esailija

回答

1

見組嵌套的數據模型,它可能有助於解決這個問題。

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

編輯:因爲需要更多的背景,下面是詳細信息。

父節點將具有覆蓋範圍[左,右]的左側屬性和右側屬性。

所有的孩子節點都將包含在該範圍內,以使得:

parent.left < = child.left < = child.right < = parent.right。

所有葉子節點的範圍都是1,因此只留下葉子的+1 + 1。

從父獲取所有的葉子,使用where類似這樣的條款:

WHERE(左+ 1 =右)和(左> = parent.left),(右< = parent.right )

+0

是鏈接的答案是**不是**答案。請添加一些背景....您的答案現在的方式,它更多的是_comment_。 – Neal

+0

@Neal,添加了上下文。 –

+0

只是說在這種情況下提供的鏈接實際上非常有用:) – tom

相關問題