SQL查询多关系表对象到映射表?

时间:2019-05-16 16:50:34

标签: mysql sql database

我有:

用户:

Joe:GroupID1
Tom:GroupID2
Tom:GroupID3

UserGroup:

Group1:RoleID1
Group2:RoleID2
Group3:RoleID3

角色:

RoleID1:Admin
RoleID2:Writer
RoleID3:Reader

现在,我可以通过匹配GroupID,然后针对像Joe这样的用户的RoleID来找到用户的角色。

如何查询仅当用户属于两个或多个特定组时才可用的角色?

例如,从“角色”表中,可以直接从Group1中指定管理员角色。但是,如果用户属于第2组和第3组,则可以选择应用“管理角色”。

我不确定如何查询这种情况,或者我是否需要更新表以解决该问题。

1 个答案:

答案 0 :(得分:0)

好吧,找到一个不是Admin而是Writer和Reader的用户就很容易了,但是要使该查询添加该用户的Admin角色则有些棘手。 >

   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'