1

我有三个 MySQL 表usersrolespositions.

users表是不言自明的。该roles表是一个人可能拥有的职位列表,例如janitorpresidentmanager等。该roles表还有一长串布尔权限,例如access_basementuser_directory_access。如果角色将该位值设置为 false(或“0”),则该角色缺少该权限。

棘手的地方在于一个用户可能有多个角色,因此它们是由positions表连接的,这只是userIdroleId字段的配对。因此,如果我执行如下查询:

SELECT * FROM users 
    LEFT JOIN positions ON users.userId=positions.userId
    LEFT JOIN roles ON roles.roleId=positions.roleId 
WHERE users.userId=123

我可能会得到如下结果:

+---------+-----------+-----------------+-----------------------+
| name    | title     | basement_access | user_directory_access |
+---------+-----------+-----------------+-----------------------+
| Bob     | Janitor   | true            | false                 |
+---------+-----------+-----------------+-----------------------+
| Bob     | President | false           | true                  |
+---------+-----------+-----------------+-----------------------+

由于 Bob 有两个角色,但每个角色都有不同的访问权限,所以我想将结果与 MySQL 查询和OR所有行的逻辑操作结合起来,生成如下表:

+---------+-----------------+-----------------------+
| name    | basement_access | user_directory_access |
+---------+-----------------+-----------------------+
| Bob     | true            | true                  |
+---------+-----------------+-----------------------+

所以问题是:是否可以在多个选定的 MySQL 行中应用 OR 运算符?

谢谢!

4

1 回答 1

1

解决此问题的一种方法是使用值 0 和 1 作为角色权限。并使用一些查询,如:

SELECT u.name, SUM(r.basement_access) AS basement_access, SUM(r.user_directory_access) AS user_directory_access
FROM users  u
  LEFT JOIN positions p ON u.userId=p.userId
  LEFT JOIN roles r ON r.roleId=p.roleId 
WHERE u.userId=123
GROUP BY u.userId;
于 2013-09-03T16:12:13.490 回答