所以我只是在弄乱NodeJS应用程序,而我正在尝试使用我的数据库实现权限系统。
这是我第一次使用任何类型的SQL环境,因此如果我做错了什么,请更正我。
我有以下表格:
permissions:
id,
name
users:
id,
name
roles:
id,
name
user_permissions:
id,
user_id,
permissions_id
role_permissions:
id,
role_id,
permission_id
user_roles:
id,
user_id,
role_id
因此,用户可以通过两种方式获得权限:通过user_roles中分配的角色或直接通过user_permissions。
我已经收到以下查询,该查询似乎正常工作。
SELECT permissions.name
FROM permissions
INNER JOIN role_permissions ON role_permissions.permission_id=permissions.id
INNER JOIN user_roles ON user_roles.role_id=role_permissions.role_id
AND user_roles.user_id=?
但是,这只会查找通过角色分配的权限。
我似乎无法使查询正确地查询各个权限。
每当我尝试以下查询
SELECT * FROM permissions INNER JOIN user_permissions ON user_permissions.user_id=?;
我得到:
+----+-------------+----+---------+---------------+
| id | name | id | user_id | permission_id |
+----+-------------+----+---------+---------------+
| 1 | permission1 | 1 | 3 | 5 |
| 2 | permission2 | 1 | 3 | 5 |
| 3 | permission3 | 1 | 3 | 5 |
| 4 | permission4 | 1 | 3 | 5 |
| 5 | permission5 | 1 | 3 | 5 |
+----+-------------+----+---------+---------------+
在这里,我已将权限5分配为用户3的个人权限,但是由于联接,它会与每个权限一起加入。
所以我想我还没有完全掌握JOIN的作用。也许有人可以在这里帮助我,并解释发生了什么事?
答案 0 :(得分:0)
您缺少具有user_permissions的联接。我认为您追求的是类似的关注
select p.name
from permissions p
join user_permissions up on up.permissions_id = p.permissions_id
join user u on u.user_id = up.user_id
where u.user_id = ?
union
select p.name
from permissions p
join role_permissions rp on rp.permission_id = p.permission_id
join user_roles ur on ur.role_id = rp.role_id
join user u on u.user_id = ur.user_id
where u.user_id = ?