SQL-запрос: увидеть отношения между массивом пользователей и группами - PullRequest
3 голосов
/ 10 мая 2011

У меня есть небольшое приложение, в котором пользователи могут войти в систему и делать там все, что они делают.Структура базы данных о пользователях ничего особенного.Есть три таблицы:

пользователи группы user_group_relation

Теперь, как я могу получить список всех групп вместе со статусом членства длямассив пользователей?

Позвольте мне пояснить это на примере.

Дэвид является членом 'пользователи' , 'администраторы' , 'экономика'
Эрик является членом 'пользователей', администраторов '
Ричард является членом ' администраторов '
Лиза являетсячлен 'administrator' , 'economy'

Вот результат, который я хотел бы получить из sql-запроса

GroupName.......................isEveryoneAMember

users   ......................  someAre  
Administrators..........        yes  
Economy ..................      someAre  
Sales   ....................... no

Ответы [ 3 ]

1 голос
/ 10 мая 2011
SELECT  g.name,
        CASE
        WHEN mcount = 0 THEN
                'none'
        WHEN mcount = ucount THEN
                'all'
        ELSE
                'some'
        END AS isEveryOneAMember
FROM    (
        SELECT  COUNT(*) AS ucount
        FROM    users
        ) u
CROSS JOIN
        (
        SELECT  group_id,
                COUNT(*) AS mcount
        FROM    user_group_relation ug
        GROUP BY
                group_id
        ) ug
JOIN    groups g
ON      g.id = ug.group_id
0 голосов
/ 10 мая 2011

Если нет повторяющихся имен групп:

WITH rollcall AS (
  SELECT
    g.name,
    ug.user_id
  FROM groups g
    CROSS JOIN users u
    LEFT JOIN user_group_relation ug ON g.id = ug.group_id AND u.id = ug.user_id
)
SELECT
  GroupName = name,
  isEveryoneAMember = CASE COUNT(user_ud)
    WHEN 0        THEN 'No'
    WHEN COUNT(*) THEN 'Yes'
    ELSE 'someAre'
  END
FROM rollcall
GROUP BY name
0 голосов
/ 10 мая 2011
select g.GroupName,
    case
        when count(ug.userId) = (select count(*) from users) then 'yes'
        when count(ug.userId) = 0 then 'no'
        else 'someAre'
    end as HowMany
from Groups g
join UserGroups ug on g.id = ug.groupId
group by g.groupName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...