使用多个外键查询表

时间:2019-10-31 21:47:20

标签: mysql sql mariadb

所以我只是在弄乱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的作用。也许有人可以在这里帮助我,并解释发生了什么事?

1 个答案:

答案 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 = ?