Подсчет количества пользователей в группах - PullRequest
2 голосов
/ 07 марта 2011

У меня есть древовидная структура ассоциации, которая разделена на подразделения, подразделения и т. Д. На каждом уровне пользователи могут иметь членство в определенных ролях.

Я хочу подсчитать членство по каждому "типу структуры"(ассоциация, подразделение, подразделение), как определено в таблице

Структура таблицы выглядит следующим образом:

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 в качестве числа участников.

Я был бы очень благодарен за любую помощь!

1 Ответ

1 голос
/ 08 марта 2011

Я предполагаю, что подсчеты, которые вы показали в ОП, надуманы. Чтобы получить требуемые результаты, необходимо создать производную таблицу используемых типов и ролей, а затем оставить соединение всего этого запроса с перекрестным соединением ролей и типов.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...