首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL连接多个结果

MySQL连接多个结果
EN

Stack Overflow用户
提问于 2012-07-17 21:05:13
回答 2查看 1K关注 0票数 0

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

这就是我所做的查询,并期望它可以工作,但它并没有工作,我猜它不能工作是因为serverPermissions表可以根据分配给用户的内容返回超过1个groupId。

代码语言:javascript
复制
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表,标识符是唯一键:

代码语言:javascript
复制
id  |  identifier  |  ...
--------------------------
 1  |  someString  |  ...
 2  | someString02 |  ...

serverPermissions表:

代码语言:javascript
复制
serverId  |  groupId  |  userId
--------------------------------
    1     |     1     |     1
    1     |     2     |     1
    1     |     2     |     2
    2     |     3     |     1
    3     |     4     |     1

serverGroupRoles表:

代码语言:javascript
复制
groupId  |  roleId
------------------
   1     |    1
   1     |    2
   1     |    3
   2     |    1
   2     |    3
   3     |    4
   4     |    2

在应用程序中,角色in被映射到某个操作。

这就是我想要完成的,但只有一个查询:如果你做了类似这样的事情,

代码语言:javascript
复制
SELECT id FROM `servers` WHERE identifier = 'someString'

返回

代码语言:javascript
复制
id
--
 1

然后获取从那里返回的id,

代码语言:javascript
复制
SELECT groupId FROM `serverPermissions` WHERE serverId = 1 AND userId = 1

然后它就会返回

代码语言:javascript
复制
groupId
-------
   1
   2

然后,对于每个groupId,

代码语言:javascript
复制
SELECT roleId FROM `serverGroupRoles` WHERE groupId = #

最终结果是,

代码语言:javascript
复制
roleId
------
   1
   2
   3

有没有用一个查询就能做到这一点的好方法?

完成任务的编辑、查询:

代码语言:javascript
复制
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'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-17 21:26:14

现在还为时尚早,但这能满足您的需求吗:

代码语言:javascript
复制
SELECT  DISTINCT sgr.roleID
FROM    serverPermissions sp
        INNER JOIN serverGroupRoles sgr ON sgr.groupID  = sp.groupID
WHERE   sp.serverID = 1
        AND sp.userID   = 1

我可能在这里偏离了目标,因为我不确定服务器表在其中的位置。如果您正在查找该表中的数据,您也可以将其加入其中:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2012-07-17 21:20:58

这是你想要的吗?

代码语言:javascript
复制
SELECT roleId
FROM `serverGroupRoles`
WHERE groupId in (SELECT groupId
                  FROM `serverPermissions`
                  WHERE serverId = 1 AND userId = 1 
                 )

也许您实际上想要"SELECT distinct roleID“来消除重复项。

您可以将其扩展到服务器,但我会将其作为一组连接:

代码语言:javascript
复制
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 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11523126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档