0

特定のユーザーが特定のサーバー内でアクセスできるすべてのロールを選択しようとしています。これは、ユーザーが 1 つ以上のサービスを管理できるようにするシステム用です。ユーザーが持つアクセスの量は、サービスが属する人によって割り当てられます。ロールはグループ化され、そのグループがユーザーに割り当てられます。ユーザーは複数のグループを持つことができます。

これは私が作成したクエリであり、機能すると期待していましたが、機能しません。serverPermissions テーブルは、ユーザーに割り当てられているものに基づいて複数の 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」テーブルには他のデータがありますが、関連はありません。

サーバー テーブル、識別子は一意のキーです。

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'
4

2 に答える 2

1

ここではまだ少し早いですが、これはあなたが望むことをしますか?

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-17T13:26:14.000 に答える
0

これは、あなたの望むことですか?

SELECT roleId
FROM `serverGroupRoles`
WHERE groupId in (SELECT groupId
                  FROM `serverPermissions`
                  WHERE serverId = 1 AND userId = 1 
                 )

おそらく、実際には重複を排除するために「個別の 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 
于 2012-07-17T13:20:57.990 に答える