![](/img/trans.png)
[英]How do I recursively select rows where values in one column are present in another column?
[英]Select all rows where all array values are present in another column
可以說我有兩個表:
--------------------------------
| user_id | permissions |
---------------------------------
| 1 | ['perm1', 'perm2'] |
---------------------------------
| 2 | ['perm1'] |
---------------------------------
----------------------------------------
| integration_id | permissions_required |
-----------------------------------------
| 1 | ['perm1'] |
-----------------------------------------
| 2 | ['perm2'] |
-----------------------------------------
| 3 | ['perm1', 'perm2'] |
------------------------------------------
我希望能夠查詢特定用戶有權訪問的所有集成。 我已經搜索了一段時間,但是對於使用mysql來說還是很新的。
我將如何查詢這些表以查找用戶具有所有必需權限的所有集成?
編輯:我知道我沒有提到Permissions和Permissions_required列是JSON列。 基於已接受的答案,我將提出有關重構數據庫權限的主題,以使用傳統的many-> many而不是arrays
這是一個清楚的示例,說明了為什么將逗號分隔的值存儲在單個列中是個壞主意。 使用您的設計,您將需要分割字符串(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
最后,我們將兩者結合起來,添加User和Integration表以獲取描述(當然這是可選的)
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.