2011-03-07 39 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