2017-04-22 37 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列。基於接受的答案,我將提出重構我們的數據庫權限的主題,以使用傳統的多→多而不是陣列

+0

你有控制表結構嗎?我的意思是,你可以創建一個不同的表格嗎? –

+0

因此在你的例子中,user_id 1會有整合1,2,3,user_id 2會有1? –

+0

@P.Salmon是的,這是正確的。 :) – Jed

回答

0

這是爲什麼在一列中存儲逗號分隔值的原因餿主意。通過設計,您需要拆分字符串(MySQL甚至沒有內置函數),然後根據拆分結果連接表。

您想要做的任務在設計正確的表格架構上會非常容易。

從頭開始,你的實體是userintegrationpermission,因此你需要爲它們中的每一個表。

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

userpermission之間的關係是many-to-many,因爲每個user可以有多個permissions每個permission可以給多個users:你想與另一臺則

UserPermission: userID, permissionID 

同來模擬這種持有permissionintegration之間的關係:每個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)

相關問題