我正在尝试选择特定用户在特定服务器中可以访问的所有角色。这适用于允许用户管理一个或多个服务的系统。用户拥有的访问量由服务所属的任何人分配。角色被分组,然后该组被分配给用户。用户可能有多个组。
这是我制作并期望工作的查询,但事实并非如此。我猜它不起作用,因为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 | ...
serverPermissions表:
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'
答案 0 :(得分:0)
这是你想要的吗?
SELECT roleId
FROM `serverGroupRoles`
WHERE groupId in (SELECT groupId
FROM `serverPermissions`
WHERE serverId = 1 AND userId = 1
)
也许你真的想要“SELECT distinct roleID”来消除重复。
您可以为服务器扩展此功能,但我会将其作为一组连接进行扩展:
SELECT distinct roleId
FROM `serverGroupRoles` sgr join
`serverPermissions` sp
on sgr.groupId = sp.groupId join
`server` s
on sp.serverid = s.id
WHERE s.identifier = 'someString' AND sgr.userId = 1
答案 1 :(得分:0)
这里还有点早,但这会做你想做的事情:
SELECT DISTINCT sgr.roleID
FROM serverPermissions sp
INNER JOIN serverGroupRoles sgr ON sgr.groupID = sp.groupID
WHERE sp.serverID = 1
AND sp.userID = 1
我可能不在这里,因为我不确定服务器表在哪里。如果您正在寻找该表中的数据,您也可以加入它:
SELECT DISTINCT sgr.roleID, s.fieldName
FROM serverPermissions sp
INNER JOIN servers s ON s.id = sp.serverID
INNER JOIN serverGroupRoles sgr ON sgr.groupID = sp.groupID
WHERE sp.serverID = 1
AND sp.userID = 1