【问题标题】:SQL - Why isn't my query working?SQL - 为什么我的查询不起作用?
【发布时间】: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


【解决方案1】:

这应该可以解决问题:

select distinct united.rightid
from (
select UR.userid userid, UR.rightid rightid
from user_right_a UR
where UR.userid=1

union

select UG.userid userid, GR.rightid rightid
from user_group_a UG
join group_right_a GR on UG.groupid=GR.groupid
) united
where united.userid=1

【讨论】:

  • 乍一看似乎可以正常工作,感谢您的帮助!
猜你喜欢
  • 2012-09-26
  • 1970-01-01
  • 2017-08-02
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多