SQL-запрос для объектов таблицы с множественными отношениями к таблице отображения? - PullRequest
0 голосов
/ 16 мая 2019

у меня есть:

Пользователь:

Joe:GroupID1
Tom:GroupID2
Tom:GroupID3

UserGroup:

Group1:RoleID1
Group2:RoleID2
Group3:RoleID3

Роль:

RoleID1:Admin
RoleID2:Writer
RoleID3:Reader

Теперь я могу найти роли пользователя, сопоставив затем GroupID и RoleID для пользователя, такого как Джо.

Как запросить a для роли, которая доступна только в том случае, если пользователь принадлежит к двум или более конкретным группам?

Например, из таблицы ролей роль администратора может быть задана непосредственно из группы 1. Однако, если есть вариант, где применяется роль администратора, если пользователь принадлежит ОБА Группа 2 и Группа 3.

Я не уверен, как запросить этот случай или мне нужно обновить таблицу, чтобы учесть это.

1 Ответ

0 голосов
/ 16 мая 2019

Ну, было бы достаточно легко найти пользователя, который не является администратором, но является писателем и читателем, но затем немного сложнее получить запрос на добавление роли администратора для этого пользователя ...

   SELECT USER.NAME, COUNT(USER.NAME) AS NUM_ROLES 
   FROM USER 
   JOIN USERGROUP ON USER.GROUPID = USERGROUP.GROUPID
   JOIN ROLE ON ROLE.ROLEID = USERGROUP.ROLEID AND ROLE.NAME IN ('Writer', 'Reader')
   GROUP BY USER.NAME
   ORDER BY 2 DESC

OR

   SELECT A.* FROM
   (SELECT USER.NAME, COUNT(USER.NAME) AS NUM_ROLES 
   FROM USER 
   JOIN USERGROUP ON USER.GROUPID = USERGROUP.GROUPID
   JOIN ROLE ON ROLE.ROLEID = USERGROUP.ROLEID
   GROUP BY USER.NAME) AS A
   WHERE A.NUM_ROLES > 1
   ORDER BY A.NUM_ROLES DESC

Если вам нужно исключить роль администратора, вы можете изменить следующую строку:

   JOIN ROLE ON ROLE.ROLEID = USERGROUP.ROLEID AND ROLE.NAME <> 'Admin'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...