2017-04-22 6 views
0

は、私は二つのテーブル持っていると言うことができます別の列に存在するすべての行を選択:私は、特定のユーザーがアクセス権を持つすべての統合を照会できるようにしたいと思いすべての配列値が

-------------------------------- 
| user_id | permissions  | 
--------------------------------- 
| 1  | ['perm1', 'perm2'] | 
--------------------------------- 
| 2  | ['perm1']   | 
--------------------------------- 

---------------------------------------- 
| integration_id | permissions_required | 
----------------------------------------- 
|  1  | ['perm1']   | 
----------------------------------------- 
|  2  | ['perm2']   | 
----------------------------------------- 
|  3  | ['perm1', 'perm2'] | 
------------------------------------------ 

を。私はしばらく検索してきましたが、私はこの程度までmysqlを使い慣れています。

ユーザーが必要な権限をすべて持っているすべての統合を見つけるためにこれらのテーブルをクエリする方法を教えてください。

編集:私はアクセス許可について言及していないことを理解します& permissions_required列はJSON列です。受け入れられた答えに基づいて、私はデータベースのアクセス許可をリストアして、配列ではなく伝統的なmany-> manyを使用するようにするつもりです

+0

あなたはテーブル構造を制御できますか?つまり、別のテーブルを作ることができますか? –

+0

あなたの例では、user_id 1には統合1,2,3があり、user_id 2には1が含まれていますか? –

+0

@ P.Salmonはい、そうです。 :) – Jed

答えて

0

これは、カンマ区切りの値を単一の列に格納することが、悪いアイデア。あなたが持っている設計では、文字列を分割する必要があります(MySQLには組み込み関数もありません)。分割の結果に基づいてテーブルを結合します。

適切に設計された表スキーマで、実行したいタスクが非常に簡単になります。

最初から始めて、エンティティはuser,integrationpermissionとなり、それぞれのテーブルが必要です。

User: id, name, whatever_else 
Integration: id, description, whatever_else 
Permission: id, description, whatever_else 

userが複数permissionsを持つことができ、各permissionが複数のusersに与えることができるので、userpermissionの関係は、many-to-manyです:あなたは別のテーブルでこれをモデルにしたい、その後

UserPermission: userID, permissionID 

同じpermissionintegrationの間の関係を保持します。それぞれintegrationは複数のpermissionsを必要とする可能性があり、それぞれ複数の場合はが必要ですintegrations。トリッキーな部分は、統合に必要なすべての権限を持つユーザーを取っている:

IntegrationPermission: integrationID, permissionID 

あなたのサンプルデータは、この

User 
id | name 
1 | User1 
2 | User2 

Permission 
id | desc 
1 | Perm1 
2 | Perm2 

UserPermission 
userID | permissionID 
1  | 1 
1  | 2 
2  | 1 

Integration 
id | desc 
1 | Integration1 
2 | Integration2 
3 | Integration3 

IntegrationPermission 
integrationID | permissionID 
1    | 1 
2    | 2 
3    | 1 
3    | 2 

今クエリのように見えるだろう。これをいくつかのステップで構築しましょう。

まず第一に、私たちは、ユーザーがその統合後

select t1.userID, 
     t2.integrationID, 
     count(distinct t2.permissionID) as userIntegrationPermissions 
from userPermission t1 
join integrationPermission t2 
on  t1.permissionID = t2.permissionID 
group by t1.userID, t2.integrationID 

のために、私たちはそれぞれの統合に必要なアクセス許可の数を必要とする持っているユーザー、統合および許可の数を取得するために、2つの関係のテーブルを結合します

select integrationID, 
     count(permissionID) permCount 
from integrationPermission 
group by integrationID 

は、最後に我々は(これは当然のオプションである)の記述を取得するには、ユーザーとの統合テーブルを追加し、これらの二つの参加

select tt3.id, tt3.name, tt4.id, tt4.desc 
from (
      select t1.userID, 
        t2.integrationID, 
        count(distinct t2.permissionID) as userIntegrationPermissions 
      from UserPermission t1 
      join IntegrationPermission t2 
      on  t1.permissionID = t2.permissionID 
      group by t1.userID, t2.integrationID 
     ) tt1 
join (
      select integrationID, 
        count(permissionID) permCount 
      from IntegrationPermission 
      group by integrationID 
     ) tt2 
on  tt1.integrationID = tt2.integrationID and 
     tt1.userIntegrationPermissions = tt2.permCount 
join User tt3 
on  tt1.userID = tt3.id 
join Integration tt4 
on  tt1.integrationID = tt4.id 
order by 1, 3 

this link (rextester)

関連する問題