我正在尝试选择特定用户在特定服务器中有权访问的所有角色。这适用于允许用户管理一个或多个服务的系统。用户拥有的访问量由服务所属的任何人分配。对角色进行分组,然后将该组分配给用户。一个用户可以有一个以上的组。
这就是我所做的查询,并期望它可以工作,但它并没有工作,我猜它不能工作是因为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这是表的视觉外观,'servers‘表有其他数据,但它们是无关的。
servers表,标识符是唯一键:
id | identifier | ...
--------------------------
1 | someString | ...
2 | someString02 | ...serverPermissions表:
serverId | groupId | userId
--------------------------------
1 | 1 | 1
1 | 2 | 1
1 | 2 | 2
2 | 3 | 1
3 | 4 | 1serverGroupRoles表:
groupId | roleId
------------------
1 | 1
1 | 2
1 | 3
2 | 1
2 | 3
3 | 4
4 | 2在应用程序中,角色in被映射到某个操作。
这就是我想要完成的,但只有一个查询:如果你做了类似这样的事情,
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有没有用一个查询就能做到这一点的好方法?
完成任务的编辑、查询:
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'发布于 2012-07-17 21:26:14
现在还为时尚早,但这能满足您的需求吗:
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发布于 2012-07-17 21:20:58
这是你想要的吗?
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 https://stackoverflow.com/questions/11523126
复制相似问题