MySQL加入多个结果

时间:2012-07-17 13:05:13

标签: mysql sql

我正在尝试选择特定用户在特定服务器中可以访问的所有角色。这适用于允许用户管理一个或多个服务的系统。用户拥有的访问量由服务所属的任何人分配。角色被分组,然后该组被分配给用户。用户可能有多个组。

这是我制作并期望工作的查询,但事实并非如此。我猜它不起作用,因为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'

2 个答案:

答案 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