2012-09-25 54 views
2

我的術語有些欠缺,所以我的問題的標題無疑是一種蹩腳的,但我會解釋我的意思下面。從數據庫中獲取多個級別的子項目?

我有一個MySQL表,看起來像下面這樣:

categories: 

category_id | parent_id 

    0   0 
    1   0 
    2   1 
    3   1 
    4   3 

現在,我想要做的是輸出的類別結構是這樣的:

category structure: 

0 
1 -> 2 
    3 -> 4 

除了需要對能夠顯示類別結構,如果選擇了一個類別,那麼我想查找該類別和子類別中的所有文章(文章將是另一個表格,其中每篇文章都會將parent_category_id視爲它所在的類別) 。

我能想到這樣做的唯一方法是:

  1. 獲取所有類別,有PARENT_ID等於通過所有的結果並重復步驟被視爲
  2. 環類的id一個
  3. 只是一直這樣做,直到所有的結果都被檢查

有沒有更好的方法來做到這一點?

回答

1

一種有效的方法是使用嵌套集。這是一個有點棘手,更新更復雜一點。

它的工作原理類似:

每個節點具有2點的ID和水平。節點ID之間的所有子節點都是ID。 例如:

category_id | parent_id | low_id | high_id 
0   0   1   2 
1   0   3   10 
2   1   4   5 
3   1   6   9 
4   3   7   8 

現在你可以說「給我1類的所有子節點」:

select * 
from categories 
where low_id between 3 /* (low_id node1) */ and 10 /* (high_id node 1) */ 

,但如果你要插入一個節點,你需要一個算法來移動的其他節點在正確的位置。 也可以存儲節點的級別,因此您不必查找id/parent_id關係,只需按low_id進行排序並將級別用作指示符。

如果您使用php作爲編程語言,則有一個doctrine2插件來處理嵌套集。

編輯:我認爲這是一個很好的開始點:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

相關問題