我正在尝试选择特定用户在特定服务器中可以访问的所有角色。这适用于允许用户管理一项或多项服务的系统。用户拥有的访问量由服务所属的任何人分配。角色被分组,然后该组被分配给用户。一个用户可能有多个组。
这是我提出并期望工作的查询,但事实并非如此。我猜它不起作用,因为 serverPermissions 表可以根据分配给用户的内容返回超过 1 个 groupId。
SELECT serverGroupRoles.roleId FROM `serverGroupRoles`, `serverPermissions`, `servers`
WHERE servers.identifier='someUniqueString' AND
serverPermissions.serverId=servers.id AND
serverPermissions.userId=1 AND
serverGroupRoles.groupId=serverPermissions.groupId
这是表的视觉外观,“服务器”表有其他数据,但它们不相关。
服务器表,标识符是唯一键:
id | identifier | ...
--------------------------
1 | someString | ...
2 | someString02 | ...
服务器权限表:
serverId | groupId | userId
--------------------------------
1 | 1 | 1
1 | 2 | 1
1 | 2 | 2
2 | 3 | 1
3 | 4 | 1
serverGroupRoles 表:
groupId | roleId
------------------
1 | 1
1 | 2
1 | 3
2 | 1
2 | 3
3 | 4
4 | 2
roleId 在应用程序中映射到某个操作。
这就是我想要完成的,但是有 1 个查询:如果你做了类似的事情,
SELECT id FROM `servers` WHERE identifier = 'someString'
退货
id
--
1
然后拿了从那里返回的id,
SELECT groupId FROM `serverPermissions` WHERE serverId = 1 AND userId = 1
然后它会返回
groupId
-------
1
2
然后对于每个 groupId,
SELECT roleId FROM `serverGroupRoles` WHERE groupId = #
而最终的结果,
roleId
------
1
2
3
有没有用 1 个查询来做到这一点的好方法?
编辑,完成任务的查询:
SELECT DISTINCT sgr.roleID
FROM serverPermissions sp
INNER JOIN servers s ON s.id = sp.serverID
INNER JOIN serverGroupRoles sgr ON sgr.groupID = sp.groupID
WHERE sp.userID = 1
AND s.identifier = 'someString'