【发布时间】:2012-11-01 22:09:07
【问题描述】:
我一直在尝试自己找到这个答案,但我太糟糕了,所以我来这里希望你能帮助我。
我有以下数据库表:
user(
int unsigned id,
varchar login
)
group(
int unsigned id,
varchar label
)
right(
int unsigned id,
varchar label
)
user_group(
int unsigned userId,
int unsigned groupId
)
user_right(
int unsigned userId,
int unsigned rightId,
boolean granted
)
group_right(
int unsigned groupId,
int unsigned rightId,
boolean granted
)
还有3个配置参数(PHP定义):
GRANTED_BY_DEFAULT可以是TRUE或FALSE。 它表示,当没有为组或用户指定权限时(即不在关联表中),是否授予权限。RESULTING_RIGHTS可以是MIN_RIGHTS或MAX_RIGHTS。 它指示在确定结果权限时是使用“AND”还是“OR”运算符。例如,如果对于右“r1”,组“g1”为 TRUE,组“g2”和“g3”为 FALSE,“MIN_RIGHTS”为 FALSE,“MAX_RIGHTS”为 TRUE。RIGHTS_PRIORITY可以是USER_OVER_GROUP或GROUP_OVER_USER。 它指示用户自己的权限是否优先于他的组的权限,或者组的权限是否会优先于用户自己的权限。
考虑到这 3 个参数和他的组,我想提出一个可以找到用户有效拥有的权限的查询,但我真的不知道该怎么做。我还可以进行多个查询并在 PHP 端完成部分工作,但我希望避免进行很多查询,因为我希望我的应用程序足够快,可以处理 AJAX 自动完成和其他类似的事情。
如果没有人愿意或有时间帮助我,我会理解的:p 感谢阅读。
编辑: 一些示例数据:
user (id, login) :
1 "Admin"
group (id, label) :
1 "g1"
2 "g2"
3 "g3"
right (id, label) :
1 "r1"
2 "r2"
3 "r3"
user_group (userId, groupId) :
1 1
1 2
user_right (userId, rightId) :
1 1 true
1 2 false
group_rights (groupId, rightId) :
1 1 true
1 2 false
2 1 false
2 3 true
根据参数和其他表的行,输出将是 (right_id, right_label) 行的列表。
在检索权限时,用户 ID 和/或登录名被认为是已知的。
【问题讨论】:
-
您能否发布一些示例数据和所需的输出?
-
有什么特殊原因必须将其全部塞入一个查询中?
-
是的,我想要一个较短的执行时间。但是,如果运行 2 / 3 次查询并没有慢多少,那也没关系。
-
有时运行 2 或 3 个简单查询比 1 个大的复杂查询要快,你知道....只是说。
-
即使我在 PDO 中使用准备好的查询?我会看看我能用更多的查询做什么,谢谢。
标签: php sql associations rights