2014-07-18 157 views
0

我得到這個表的結構:樹結構MySQL查詢

----------------------------------- 
    Name  DocID  ParentID 
    ----------------------------------- 
    doc1   1   NULL 
    doc2   2   1   
    doc3   3   NULL 
    doc4   4   3 
    doc5   5   1 

查詢應輸出的樹結構與家長和孩子的節點,該水平可爲任意值。 輸出是這樣的:

doc1 
    | --doc2 
    | --doc5 
    | 
    doc3 
     --doc4 

你能幫忙做的是,在MySQL中的簡單或遞歸查詢的MySQL?

+0

只有兩個級別,對吧?所以沒有遞歸! – Strawberry

+1

可能重複的[MySQL - 遞歸樹結構](http://stackoverflow.com/questions/2378678/mysql-recursing-a-tree-structure) –

+0

沒有級別的數目是未知的,它是一個無限的樹結構 – Safwen

回答

0

爲您的數據模型(稱爲鄰接列表)編寫類似的查詢會相對複雜且效率低下。如果您確實需要這樣做,請查看http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html#adjacency_list_model

如果你不介意改變你的數據模型中,有兩種方法:

  1. 嵌套集合 - http://en.wikipedia.org/wiki/Nested_set_model。這是最常見和易於使用的。有很多腳本和框架可以幫助使用嵌套集,而無需管理所有低級操作。如果你有現有的數據,你可以循環遍歷現有的行並將它們插入到新的嵌套集表中,這樣你就可以開始行動了。
  2. 或者,您可以將每個文檔的完整分層路徑(如麪包屑)存儲在新列中。喜歡的東西:

    ------ 
    Path 
    ------ 
    doc1 
    doc1>doc2 
    doc1>doc5 
    doc3 
    doc3>doc4 
    

第二個方法可以讓你做一個簡單的SELECT與ORDER BY的「路徑」。然後,您可以查看「>」(或您使用的任何字符)的數量,以確定層次結構中文檔的級別(在UI中縮進多少)。

第二種方法並不理想,因爲它需要更多的維護。如果您更改了一個親子關係,則最終必須重新生成所有路徑。嵌套集還涉及相當數量的行更新,但是它非常高效。