這是爲什麼在一列中存儲逗號分隔值的原因餿主意。通過設計,您需要拆分字符串(MySQL甚至沒有內置函數),然後根據拆分結果連接表。
您想要做的任務在設計正確的表格架構上會非常容易。
從頭開始,你的實體是user
,integration
和permission
,因此你需要爲它們中的每一個表。
User: id, name, whatever_else
Integration: id, description, whatever_else
Permission: id, description, whatever_else
user
和permission
之間的關係是many-to-many
,因爲每個user
可以有多個permissions
每個permission
可以給多個users
:你想與另一臺則
UserPermission: userID, permissionID
同來模擬這種持有permission
和integration
之間的關係:每個integration
可能需要多個permissions
,每個permission
可能需要多個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
然後許可的數量,我們需要爲每個積分所需的權限的計數
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