【问题标题】:How can I use the result of an inner join query in a left join query, in one query如何在一个查询中使用左连接查询中的内连接查询的结果
【发布时间】:2021-06-03 10:23:40
【问题描述】:

我正在使用此查询通过会话 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:

authorized_users:

user_permissions:

【问题讨论】:

    标签: mysql sql


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

    然后获取特定会话: 选择 up.permission_name FROM authorized_users au JOIN 会话 ON au.user_id = s.user 左连接 user_permissions 向上 在 up.app = 'global' 和 au.permissions & up.bits WHERE s.id = 'SESSION_ID_HERE';

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

    【讨论】:

      【解决方案2】:

      您可以使用 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 和权限名称列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-29
        • 2021-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多