MySQL:具有自定义分层功能的GROUP BY

时间:2014-11-20 14:52:18

标签: mysql group-by hierarchical

我有权限/权限 - 表格如下:

+----+----------+----------+------+-------+
| id | name     | usertype | read | write |
+----+----------+----------+------+-------+
|  1 | test     | A        |    0 |     0 |
|  2 | test     | MU       |    1 |     1 |
|  3 | test     | U        |    1 |     1 |
|  4 | apple    | A        |    1 |     1 |
|  5 | apple    | MU       |    1 |     0 |
|  6 | apple    | U        |    0 |     0 |
|  7 | flower   | A        |    0 |     0 |
|  8 | flower   | MU       |    0 |     0 |
|  9 | flower   | U        |    1 |     1 |
+----+----------+----------+------+-------+

有3种使用类型:A(管理员),MU(维护用户),U(标准用户)
usertypes是分层的:A > MU > U

usertypes在数据库中保存为CHAR(2),遗憾的是我无法更改

现在我想构建一个实现我的usertypes的层次逻辑的查询。

e.g。 usertype' A'没有获得读取或写入名称' test'的东西的许可,因此使用类型' MU'和' U'也应该没有权限,他们的read = 1write = 1应该被忽略。

我知道当前登录的是哪种usertype。 我想,我不得不检查所有分层前辈的name的最小读/写权限。但我不知道如何检查,因为usertype不是数字字段。

这是我迄今为止所尝试过的:

SELECT 
    name,
    MIN(read),
    MIN(write),
    CASE
        WHEN usertype = 'A' THEN 0
        ELSE (CASE
            WHEN usertype = 'WU' THEN 1
            ELSE 2
        END)
    END userval
FROM
    permissions
-- WHERE usertype <= :current_usertype 
GROUP BY name

这似乎有效,但我不知道如何让我的条件WHERE usertype <= :current_usertype正常工作,因此层次结构中的用户类型无法获得{{1}的更多权限而不是&#34;更高&#34;用户类型。

任何想法?

提前感谢!

1 个答案:

答案 0 :(得分:0)

这就是我解决问题的方法:

<强> 1。我添加了另一个表&#34; permission_groups&#34;到数据库:

+----+----------+--------+
| id | usertype |  value |
+----+----------+--------+
|  1 | A        |    100 |
|  2 | MU       |     20 |
|  3 | U        |     10 |
+----+----------+--------+


 的 2。然后我把这张桌子加到我原来的桌子上#34;权限&#34;我在问题中表明了这一点:
在这里,我得到了我的&#34; permission_groups&#34;带子查询的表。此值表示我的不同usertypes的层次结构顺序。

SELECT 
    perm.name,
    MIN(perm.`read`),
    MIN(perm.`write`),
    group .value
FROM
    permissions perm
LEFT JOIN permission_groups group ON group.usertype = perm.usertype 
WHERE
   group.value >= (SELECT value from permission_groups WHERE usertype = :current_usertype)
GROUP BY perm.name
在我的情况下,

:current_usertypePDO参数,它被当前用户的usertype取代。