簡體   English   中英

選擇所有數組值都出現在另一列中的所有行

[英]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甚至沒有內置的功能),然后根據分割的結果聯接表。

在正確設計的表架構上,您要執行的任務將變得異常容易。

從頭開始,您的實體是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

最后,我們將兩者結合起來,添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM