【发布时间】:2013-05-13 01:51:42
【问题描述】:
我有一个 PHP/MySQL 应用程序,其中有用户、组和权限:
- 每个用户可以在 0..N 个组中
- 每个组可以有 0..N 个用户
- 每个用户可以拥有 0..N 个权限
- 每个权限可以授予 0..N 个用户
- 每个组可以有 0..N 个权限
- 每个权限可以授予 0,N 个组
这是我的实体表:
user_e:
- 身份证
- 登录
- 密码
- 等等……
group_e:
- 身份证
- 标签
right_e:
- 身份证
- 标签
还有我的关联表:
user_group_a:
- userId 引用 user_e.id
- groupId 引用 group_e.id
user_right_a:
- userId 引用 user_e.id
- rightId 引用 right_e.id
group_right_a:
- groupId 引用 group_e.id
- rightId 引用 right_e.id
到目前为止,它还是很简单的,没有什么真正原创的。 我的问题是我想要一个可以“获取授予给定 ID 的用户或用户所属的任何组的不同权限”的查询。或者换一种说法:“给定用户的权利和他的组的权利的(不同的)联合)
例如:
- 组 1 具有权限 1 和 2
- 组 2 拥有权利 6 和 7
- 用户 1 在组 1 和组 2 中
- 用户 1 拥有权限 2、3 和 4
那么用户 1 拥有权限 1 和 2(来自第 1 组)、6 和 7(来自第 2 组)以及 2、3、4(来自他自己)。 所以最后查询必须返回权限1、2、3、4、6、7
到目前为止,我有以下查询:
SELECT DISTINCT R.*
FROM user_e U
LEFT JOIN user_right_a UR
ON U.id = UR.userid
LEFT JOIN right_e R
ON R.id = UR.rightid
LEFT JOIN user_group_a UG
ON U.id = UG.userid
LEFT JOIN group_right_a GR
ON UG.groupid = GR.groupid
AND R.id = GR.rightid
WHERE U.id = 1
但是当我在我的测试数据库中运行它时,我已经放置了一些测试数据(如果需要,我可以提供)它返回一个所有属性(id、标签)设置为 NULL 的权限,而它应该返回几行。
这个查询有什么问题?
感谢您的帮助:)
编辑:这里是数据:http://www.fileden.com/files/2007/8/1/1314138/test.sql(由 phpmyadmin 导出)
【问题讨论】:
-
没有数据就无法判断
-
我编辑了我的答案,其中包含一个指向重新创建数据库的 .sql 文件的链接。
标签: mysql sql associations row