2011-12-08 67 views
0

我在MySQL的是這樣的一個categories表:選擇字段級聯

categoryId | categoryTitle | definedField | parentId 
    1    Title   123   NULL 
    2   AnotherTitle  234   1 
    3   AndAnotherOne  NULL   1 

什麼,我需要做的就是找到了上去過父母,這樣最接近definedField值;

由於第2類具有definedField,返回其值; 由於類別3沒有definedField,請向上搜索其父項。它已經定義了字段,因此將其返回。如果它沒有,搜索直到找到一個。

將有ALLWAYS是將具有definedField集的最高類別。我只需要找到一個好的算法在MySQL InnoDb表中搜索。

+0

MySQL沒有使用層次結構的機制。您可以多次加入'categories'表來查找definedField,但這不是有效的。我會在應用程序中執行此操作。 – Devart

回答

2

有MySQL中獲取分層數據(如,例如,Postgres的的遞歸查詢)的直接方式。這是一個很好的文章總結實現嵌套數據在MySQL設置不同的方式:在同一時間http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

大多數用戶或其他已在 SQL數據庫處理分層數據,毫無疑問了解到 分級管理數據不是關係數據庫的目標。 關係數據庫的表是不分層(如XML), 但只是一個平坦的列表。分層數據具有不自然的關係 數據庫表來表示父子關係 。

本文涵蓋兩種模型:鄰接列表和嵌套集。

鄰接表型號

在鄰接列表模式,在表中每個項目包含一個指向 其父。最上面的元素,在這種情況下是電子元件,其父元素的NULL值爲 。鄰接表模型的優勢在於其非常簡單,很容易看出FLASH是玩家的孩子,這是便攜式電子產品的孩子,它是兒童電子產品的子公司。儘管在客戶端代碼中可以很容易地處理相鄰列表模型012xx,但在純SQL中使用模型可能會遇到更多問題。

嵌套集模型

在嵌套集模型,我們可以看一下我們的層次結構的新途徑, 還不如節點和線路,但嵌套容器。

+0

嗯。這意味着,我可能不得不找到一種方法來查找這些數據並將其緩存以供進一步使用。謝謝! –