これは、カンマ区切りの値を単一の列に格納することが、悪いアイデア。あなたが持っている設計では、文字列を分割する必要があります(MySQLには組み込み関数もありません)。分割の結果に基づいてテーブルを結合します。
適切に設計された表スキーマで、実行したいタスクが非常に簡単になります。
最初から始めて、エンティティはuser
,integration
、permission
となり、それぞれのテーブルが必要です。
User: id, name, whatever_else
Integration: id, description, whatever_else
Permission: id, description, whatever_else
各user
が複数permissions
を持つことができ、各permission
が複数のusers
に与えることができるので、user
とpermission
の関係は、many-to-many
です:あなたは別のテーブルでこれをモデルにしたい、その後
UserPermission: userID, permissionID
同じpermission
とintegration
の間の関係を保持します。それぞれ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)
あなたはテーブル構造を制御できますか?つまり、別のテーブルを作ることができますか? –
あなたの例では、user_id 1には統合1,2,3があり、user_id 2には1が含まれていますか? –
@ P.Salmonはい、そうです。 :) – Jed