簡體   English   中英

如何在一個查詢中使用左連接查詢中的內連接查詢的結果

[英]How can I use the result of an inner join query in a left join query, in one query

我正在使用此查詢通過 session id 從他們的 session 獲取用戶數據

SELECT authorized_users.* 
  FROM sessions 
  JOIN authorized_users 
    ON authorized_users.user_id = sessions.user 
 WHERE sessions.id = 'SESSION_ID_HERE';

然后,我使用此查詢通過將權限 integer 與一個充滿所有可能權限的表進行比較來獲取用戶的權限(按位)

SELECT user_permissions.permission_name 
  FROM authorized_users 
  LEFT 
  JOIN user_permissions 
    ON authorized_users.permissions & user_permissions.bits 
 WHERE authorized_users.user_id = 'USER_ID_HERE' 
   AND user_permissions.app = 'global'

在此示例中,應用程序名稱是全局的,但可以是一系列不同的應用程序,所有應用程序的權限與位和權限名稱存儲在同一個表中,位可以有重復項,因此應用程序名稱用於區分需要哪些應用程序權限。

如何使用一個查詢來做到這一點?

我的目標是從用戶的 session id 中獲取用戶擁有的權限名稱

這是我的表:

sessions

會話表

authorized_users

授權用戶表

user_permissions

用戶權限表

您的第二個查詢應如下所示:

SELECT up.permission_name 
FROM authorized_users au LEFT JOIN
     user_permissions up
     ON up.app = 'global' AND
        au.permissions & up.bits 
WHERE au.user_id = 'USER_ID_HERE' ;

重要的部分是將'global'比較移至ON子句。 正確使用表別名只是一個建議。

然后獲取特定的 session:SELECT up.permission_name FROM authorized_users au JOIN session s ON au.user_id = s.user LEFT JOIN user_permissions up on up.app = 'global' ANDE au. 'SESSION_ID_HERE';

目前尚不清楚為什么需要LEFT JOIN 您可能只想使用INNER JOIN來執行此操作——如果沒有權限滿足條件,則不會返回任何行。

您可以使用 JOIN 操作將這兩個查詢合二為一。

SELECT authorized_users.user_id, 
       user_permissions.permission_name 
  FROM sessions
  JOIN authorized_users 
             ON authorized_users.user_id = sessions.user
  LEFT JOIN user_permissions 
             ON authorized_users.permissions & user_permissions.bits 
            AND user_permissions.app = 'global'
 WHERE sessions.id = 'SESSION_ID_HERE';

如果我正確理解您的數據,這應該會為您提供SESSION_ID_HERE session 中所有用戶的用戶 ID 和權限名稱列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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