【发布时间】:2019-12-09 23:04:28
【问题描述】:
我正在开展一个项目,其中用户需要根据他们连接的部门获得权限。
所以现在我正在尝试执行一个查询,该查询将根据用户部门 ID 向我显示具有所有必要权限的用户(不具备所有必要权限的用户不应显示在结果中)。
我一直在尝试很多不同的事情(不同类型的 JOINS、子查询 w/where in、exists 和 union distinct),但没有运气,这种查询对我来说是下一个层次,挑战了我的逻辑思维。
表格:
users
id
first_name
last_name
department_id
permissions
id
name
departments (relation to groups and categories based on department)
id
name
category_id
group_id
categories
id
name
groups
id
name
departments_permissions (permission requirement)
department_id
permission_id
categories_permissions (permission requirement)
category_id
permission_id
groups_permissions (permission requirement)
group_id
permission_id
users_permissions (users have permissions here)
user_id
permission_id
部门
- 一个部门 CAN(非必需)拥有许多权限 (departments_permissions)。
- 一个部门可以(非必需)有一个类别。
- 一个部门可以(非必需)有一个组。
类别
- 一个类别 CAN(非必需)具有许多权限 (categories_permissions)。
组
- 一个组 CAN(非必需)具有许多权限 (groups_permissions)。
重要的旁注
departments_permissions、categories_permissions 和 groups_permissions 可以包含一个或多个相同的 permission_id,因此我们必须选择不同的值。
示例数据
我最近的查询尝试:
SELECT
`users`.id,
`users`.first_name,
`users`.last_name,
`users`.department_id
FROM
`users`
INNER JOIN
`departments` ON `users`.department_id = `departments`.id
INNER JOIN
`users_permissions` ON `users`.id = `users_permissions`.user_id
INNER JOIN
(
SELECT permission_id FROM departments_permissions WHERE department_id = departments.id
UNION DISTINCT
SELECT permission_id FROM categories_permissions WHERE category_id = departments.group_id
UNION DISTINCT
SELECT permission_id FROM groups_permissions WHERE group_id = departments.group_id
) AS tblPermissionsRequired ON `users_permissions`.permission_id = `tblPermissionsRequired`.permission_id
GROUP BY
`users_permissions`.user_id;
【问题讨论】:
-
来自不同表的样本数据与您的预期输出会有所帮助。
-
@mkRabbani 我已经更新了我的问题(参见 pastebin url)。
-
您没有详细说明查询应该返回什么。用户何时“拥有基于用户部门 ID 的所有必要权限”? “基于”模糊总结的确切条件是什么? PS请将您的问题所需的所有内容作为剪切粘贴和可运行的文本放入您的问题中。 minimal reproducible example PS您给出了您的情况/状态的某些方面,即对表值的一些约束,但是您需要为每个表(基本和查询结果)告诉我们其中一行关于情况/状态的说明它的列值。
-
@philipxy 我想从 users 表中检索行(查看我最近的查询尝试,特别是选择部分)。一个用户拥有所有必要的权限,当 users_permissions 包含通过 department_id -> 部门 -> 部门_permissions、categories_permissions、groups_permissions 与用户相关的所有权限时。在任何权限表中可能有也可能没有权限要求。如果有,请将所有不同的权限与用户权限匹配。查看 pastebin url 以查找示例数据和预期输出示例。
-
A minimal reproducible example 包括剪切&粘贴&可运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签;明确的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不可以。 (调试基础。)
标签: mysql sql join union distinct