我正在使用此查询通过会话 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
:
答案 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 和权限名称列表。