2008-12-18 127 views
0

我有一組數據模擬分類的層次結構。根類別包含一組頂級類別。每個頂級類別都包含一組子類別。每個子類別都有一組組織。一個給定的組織可以出現在多個子類別中。如何在給定節點下的SQL層次結構中選擇所有葉節點?

此層次結構的葉節點是組織。一個組織可能會出現在多個子類別中。

的數據被存儲在三個SQL表:

organizations 
organization_id organization_name 
1    Org A 
2    Org B 
3    Org C 
4    Org D 
5    Org E 
6    Org F 

categories 
category_id parent_id category_name 
0   NULL  Top Level Category 
1   0   First Category 
2   0   Second Category 
3   1   Sub Category A 
4   1   Sub Category B 
5   1   Sub Category C 
6   2   Sub Category D 

organizations_categories -- Maps organizations to sub_categories 
organization_id category_id 
1    3 
2    3 
2    6 
3    4 
4    4 
5    4 
6    5 
6    4 
7    6 
8    6 

我希望能夠在給定的類別或子類別,選擇所有獨特的組織的名單。

我做它現在的方式包括:首先搞清楚已請求的子類別,然後通過每個代碼sub_category循環和進行選擇來獲得映射到該類別的所有組織。每個select的結果都附加到數組中。只要組織出現在多個子類別中,此數組就會包含重複項。

我很樂意與一個查詢,可以有效地選擇給定的層次結構中的類別之一的ID不同的組織的名單,以取代這種雜牌。

我使用PHP和MySQL devloping這個解決方案。

感謝您的時間和建議。

回答

4

假設您的層次結構始終是深正好3個層次:

SELECT DISTINCT 
    O.organization_id, 
    O.organization_name 
FROM 
    Categories CAT 
INNER JOIN Categories SUB ON 
    SUB.parent_id = CAT.category_id 
INNER JOIN Category_Organizations CO ON 
    CO.category_id = SUB.category_id 
INNER JOIN Organizations O ON 
    O.organization_id = CO.organization_id 
WHERE 
    CAT.category_id = @category_id 

可以修改一個級別,讓你通過一個子類別ID。如果你不知道你是否擁有一個類別ID或子類別ID的時候不要那麼你就可以做到以下幾點:

SELECT DISTINCT 
    O.organization_id, 
    O.organization_name 
FROM 
    Categories CAT 
LEFT OUTER JOIN Categories SUB ON 
    SUB.parent_id = CAT.category_id 
INNER JOIN Category_Organizations CO ON 
    CO.category_id IN (CAT.category_id, SUB.category_id) 
INNER JOIN Organizations O ON 
    O.organization_id = CO.organization_id 
WHERE 
    CAT.category_id = @category_id 

如果您的層次結構可能有未知數量的水平(或你認爲它可能在將來),然後檢查出Joe Celko's Trees and Hierarchies in SQL for Smarties爲模型層次結構的替代方法。無論如何,這可能是一個好主意。

+0

就是這樣。好的解決方案非常感謝你。 – GloryFish 2008-12-18 18:43:13

0

不知道你的數據模型將允許它,但你可以使用一個索引列和二叉樹輕鬆地存儲在一個單一的「OrganizationTree」表信息。也有您使用任何修改單個查詢的類別,子類別,或組織水平搜索的好處(例如給我X子類別的結果)

希望這有助於。

亞當。

相關問題