2010-05-27 26 views
3

我有一個數據庫,其中的項目被放入類別。一些這些類別是嵌套的,所以作爲一個例子:使用mysql查詢找到所有嵌套子類別的最密集方法

Animals > Birds > Parrots 
Animals > Birds > Penguin 
Animals > Mammals > Cats 
Animals > Mammals > Dogs 
Animals > Reptiles > Snakes 
Plants > Trees 
Plants > Flowers 

我在沿着

CATEGORY PARENT 
Animals  - 
Birds  Animals 
Penguin  Birds 

線的表具有這些等

我想爲了能夠說出動物的出發點並列出所有屬於它的子類別,所以對於動物,我們將列出鳥類,哺乳動物,爬行動物,鸚鵡,企鵝,貓,DOPS,蛇

這可能與一個單一的查詢?如果不是,那會我需要做

TIA

+1

兩個選項:(1)選擇表的一個查詢的全部內容,並做遍歷在PHP [用於大型數據集壞主意](2)考慮用「嵌套更換你的父/子架構設置「http://dev.mysql.com/tech-resources/articles/hierarchical-data.html – 2010-05-27 23:40:21

回答

0

SQL是遍歷分層數據不好是衆所周知的。

我會編程,並遞歸或迭代地找到所有的孩子。

以下僞代碼應工作(如果在數據中沒有循環)

  • 添加動物的兒童至數組A
  • 索引= 0
  • 而指數<長度(A)
    • 追加兒童(A [I]),以陣列
    • 指數=指數+ 1

如果有層次結構中的循環,你必須確保你沒有追加的孩子,其已經在陣列中或循環將消耗所有的內存和系統崩潰

1

這是可能的,有效的做到這一點如果向架構添加一些層次結構元數據,則只需一個查詢。

將兩個整數列(startend)添加到您的類別表中。然後對樹進行深度優先遍歷,在每一步增加一個計數器,並在進入一個節點時將計數器值分配給start,並在離開時(即,當它的所有子節點都已被處理時)將其分配給end

因此,對於你的榜樣,以顯示爲(start,end)值:

Animals (1,18) 
    Birds (2,7) 
     Parrots (3,6) 
     Penguin (4,5) 
    Mammals (8,13) 
     Cats (9,12) 
     Dogs (10,11) 
    Reptiles (14,17) 
     Snakes (15,16) 
Plants (19,24) 
    Trees (20,23) 
    Flowers (21,22) 

我們選擇讓動物和它的孩子,你可以運行這樣的查詢:

SELECT * FROM Category where start >=1 and start < 18 

你顯然有當層級更改爲讀取查詢的效率時,權衡重建元數據的成本。對於相對靜態的層次結構,這種技術運行得很好。

1

你可以逃脫遞歸,並使用單一查詢來發現孩子計數,立即類別和子類別中使用單個SQL查詢按照以下「修改預購樹的遍歷」文章:

  1. Managing Hierarchical Data in MySQL

在google.com搜索關鍵詞「修改過的樹遍歷+ Sitepoint」以閱讀sitepoint.com上的一篇文章,它解釋了相同的模式。