特定のユーザーが特定のサーバー内でアクセスできるすべてのロールを選択しようとしています。これは、ユーザーが 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'