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”为假,则“最小权利”为假,而“最大权利”为真

  • 权限优先权
    可以是
    用户优先于组
    用户优先于组
    。 它指示用户自己的权限是否覆盖其组的权限,或者组的权限是否覆盖用户自己的权限

考虑到这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和/或登录名被视为已知

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中使用准备好的查询?我会看看我还能做些什么,谢谢。非常感谢你花时间回答我:)我会试试这个!