2011-03-07 41 views
2

我有一個關聯的樹結構,分爲不同的部門,細分等用戶可能具有某些角色的成員資格。計算用戶在組中的成員

我想指望每一個「結構型」的成員(協會,部門,分支機構)如表

表結構如下定義如下:

table intern_structures 
Contains the hierarchy (nested set, but that does not matter here) 
id | intern_structure_type_id |  name  | parent_id | lft | rgt 
1   1     My Company USA  0  1  6 
2   2      Texas    1  2  5 
3   3      El Paso   2  3  4   

table intern_structure_types 
Contains Description to the types like "association", "division", "subdivision" 
id |  name 
1  Association 
2  Division 
3  Subdivision 


table memberships 
Contains the memberships 
id | user_id | intern_structure_id | role_id 
1  1    1    1 
2  1    2    2 
3  2    3    1 
3  2    3    3 
....  

table roles 
Contains role descriptions 
id | name 
1 Admin 
2 Moderator 
3 Clerk 

我想要一個分組名單像:

structure_type_name  | role_name  | count of memberships 
    Association   Admin     1 
    Association   Moderator    10 
    Association   Clerk     0 << !! I miss the zero rows! 
    Division    Admin     7 
    Divison    Moderator    43 
    Division    Clerk     31 
    Subdivision   Admin     234 
    Subdivision   Moderator    942 
    Subdivision   Clerk     456 

我取得了到目前爲止,這是查詢:

SELECT 
    is_types.name, 
    roles.name, 
    COUNT(memberships.id) 
FROM 
    roles, 
    intern_structure_types AS is_types 
     LEFT JOIN intern_structures AS is_elements ON is_elements.intern_structure_type_id = is_types.id  
     LEFT JOIN memberships ON memberships.intern_structure_id = is_elements.id 
WHERE 
    roles.id = memberships.role_id 
GROUP BY 
    is_types.id, roles.id 

它工作正常除了它沒有列出所有角色,因爲有些角色還沒有任何成員資格,但我希望他們列出以及0作爲成員資格計數。

我會非常感謝任何幫助!

+0

我認爲這個問題可能是我想從兩個表中的所有行:從類型表中的所有行和所有行的角色表 – sled 2011-03-07 20:43:20

回答

1

我假設你在OP中顯示的計數是人爲設計的。要獲得你想要的結果,你應該創建一個正在使用的類型和角色的派生表,然後將整個查詢留給角色和類型的交叉連接。

Select is_types.name 
    , roles.name 
    , Count(Z.is_type_name) 
From roles 
    Cross Join intern_structure_types As is_types 
    Left Join (
       Select is_types.name As is_type_name 
        , roles.name As role_name 
       From intern_structures As is_elements 
        Join intern_structure_types As is_types 
         On is_types.id = is_elements.intern_structure_type_id 
        Join memberships 
         On memberships.intern_structure_id = is_elements.id 
        Join roles 
         On roles.id = memberships.role_id 
       ) As Z 
     On Z.is_type_name = is_types.name 
      And Z.role_name = roles.name 
Group By is_types.name, roles.name 
+0

純迷死人的感謝!現在很明顯。 – sled 2011-03-07 22:35:02