如何在左连接查询中使用内部连接查询的结果,在一个查询中

时间:2021-06-03 10:23:40

标签: mysql sql

我正在使用此查询通过会话 ID 从他们的会话中获取用户数据

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

然后我使用此查询通过将用户拥有的权限整数与包含所有可能权限的表进行比较来获取用户的权限(按位)

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'

在这个例子中应用名称是全局的,但可以是一系列不同的应用,所有应用的权限都存储在同一个表中,位和权限名称,位可以有重复,因此应用名称用于区分哪些应用权限需要。

我如何使用一个查询来做到这一点?

我的目标是从用户的会话 ID 中获取权限名称

这是我的表格:

sessions

Sessions table

authorized_users

Authorized users table

user_permissions

User permissions table

2 个答案:

答案 0 :(得分:1)

您的第二个查询应如下所示:

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 子句。正确使用表别名只是一个建议。

然后获取特定会话: SELECT up.permission_name FROMauthorized_users au JOIN 会话数 ON au.user_id = s.user LEFT JOIN user_permissions up ON up.app = 'global' AND au.permissions & up.bits WHERE s.id = 'SESSION_ID_HERE';

不清楚为什么需要 LEFT JOIN。您可能只想使用 INNER JOIN 来执行此操作 - 如果没有满足条件的权限,则不会返回任何行。

答案 1 :(得分:0)

您可以使用 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 会话中所有用户的用户 ID 和权限名称列表。