2012-09-05 20 views
2

假設我有一個層次結構對象表:如何查詢圖/分層數據在MySQL

A 
|--B 
|--C 
| +--D 
+--E 

它們存儲在「父子」表這樣的:

parent child 
A  B 
A  C 
C  D 
A  E 

如何查詢這個以獲得上面定義的結構?我想我需要的東西,產生這樣的信息:

object full_path 
A  NULL 
B  A 
C  A 
D  A.C 
E  A 

我想不出如何做嵌套多層次的對象。感覺就像我可能需要遍歷表(不知道這是否可能在SQL中),或者使用某種我以前從未遇到過的查詢。

附加信息:

  1. 需要不是唯一孤立對象。
  2. 孩子可能有多個父母,但現在我很高興答案無論哪種情況更容易解決。我可以遵循簡單的GROUP BYMIN聲明,遵守將多父結構轉換爲單親父母。
+0

是否所有的項目都只有一個父親,數據是否有單頭(即只有一個沒有父級,所有項目都從A下降),並在中間表A是否有記錄表明它沒有父母? – joocer

+0

請參閱修改。 A沒有記錄表明它沒有父節點,但是這可以通過簡單的「左連接」查詢來確定。 – cammil

回答

-1

如果你有一個鍵(varchar)你可以按它排序。關鍵值將是這樣的:

001 
001.001 
001.001.001 
001.001.002 
001.001.003 
002 
002.001 
002.001 
003 
003.001 
... 
... 
+0

這就是爲什麼我需要鑰匙。我如何得到它? – cammil

0

你不能與MySQL這樣做,因爲MySQL不支持遞歸函數,但如果你不需要無限的深度,你可以使用自聯接來獲取樹。否則,您需要使用編程語言的遞歸函數,或者您可以使用嵌套集,這使得挑選子樹更容易。

0

MySQL不支持遞歸查詢。但是,如果您可以使用簡化獲取子樹的Nested Set

0

基本上這是行不通的!

您需要定義根節點。順便說一句,你的「樹」與你的外形定義不符。

這將是一個更好的辦法:

parent child 
-  A 
A  B 
A  C 
C  D 
-  E 

減號父項是根節點。這反映了你的樹。

Sql不提供層次結構查詢。但你可以遍歷蒙山一招:

一個很好的解釋可以在這裏找到:

我會嘗試找到根節點d使用遞歸來連接文本。

根節點將是:

SELECT * FRON objects WHERE parent = '-' 
+0

我認爲我的樹圖匹配! (也許我的圖是非標準的) – cammil