![](/img/trans.png)
[英]How to do this query in MySQL which one should I use using left join or right join or inner join?
[英]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.