Php 如何用SQL编写?
我一直试图自己找到这个答案,但我实在太糟糕了,所以我来这里希望你能帮助我 我有以下数据库表:Php 如何用SQL编写?,php,sql,associations,rights,Php,Sql,Associations,Rights,我一直试图自己找到这个答案,但我实在太糟糕了,所以我来这里希望你能帮助我 我有以下数据库表: user( int unsigned id, varchar login ) group( int unsigned id, varchar label ) right( int unsigned id, varchar label ) user_group( int unsigned userId, int
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定义):
默认授予,可以是
或TRUE
。 当未为组或用户(即不在关联表中)指定权限时,它指示是否授予该权限FALSE
可以是结果权限
或最小权限
。 它指示在确定结果权限时是否使用“AND”或“or”运算符。例如,如果对于右“r1”,组“g1”为真,组“g2”和“g3”为假,则“最小权利”为假,而“最大权利”为真最大权限
可以是权限优先权
或用户优先于组
。 它指示用户自己的权限是否覆盖其组的权限,或者组的权限是否覆盖用户自己的权限用户优先于组
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和/或登录名被视为已知
DECLARE @USERID INT = 1,
@GRANTED_BY_DEFAULT INT = 0,
@RESULTING_RIGHTS VARCHAR(20) = 'MIN_RIGHTS',
@RIGHTS_PRIORITY VARCHAR(20) = 'USER_OVER_GROUP'
SELECT
R.ID,
R.NAME,
CASE
WHEN MAX(UR.Value) IS NULL AND MAX(GR.Value) IS NULL THEN
@GRANTED_BY_DEFAULT
WHEN MAX(UR.Value) IS NOT NULL AND MAX(GR.Value) IS NOT NULL THEN
CASE
WHEN @RIGHTS_PRIORITY = 'USER_OVER_GROUP' THEN
MAX(UR.Value)
ELSE
CASE
WHEN @RESULTING_RIGHTS = 'MIN_RIGHTS' THEN
MIN(GR.Value)
ELSE
MAX(GR.Value)
END
END
WHEN MAX(GR.Value) IS NULL THEN
MAX(UR.Value)
ELSE
CASE
WHEN @RESULTING_RIGHTS = 'MIN_RIGHTS' THEN
MIN(GR.Value)
ELSE
MAX(GR.Value)
END
END VALUE
FROM
[Right] R
CROSS JOIN [User] U
LEFT JOIN [User_Right] UR
ON R.ID = UR.RightID
AND UR.UserID = U.ID
LEFT JOIN [User_Group] UG
ON UG.UserID = U.ID
LEFT JOIN [Group_Right] GR
ON UG.GroupID = GR.GroupID
AND GR.RightID = R.ID
WHERE
U.ID = @USERID
GROUP BY
R.ID,
R.NAME
下面是一个SQL fiddle示例您可以发布一些示例数据和所需的输出吗?是否有任何特殊原因需要将其全部塞入一个查询?是的,我希望有一个较短的执行时间。但如果运行2/3查询的速度不会慢很多,那么也可以。有时运行2或3个简单查询比运行1个大型复杂查询的速度要快。。。。只是说。即使我在PDO中使用准备好的查询?我会看看我还能做些什么,谢谢。非常感谢你花时间回答我:)我会试试这个!