Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:具有自定义分层功能的分组方式_Mysql_Group By_Hierarchical - Fatal编程技术网

MySQL:具有自定义分层功能的分组方式

MySQL:具有自定义分层功能的分组方式,mysql,group-by,hierarchical,Mysql,Group By,Hierarchical,我有一个权限/特权表,如下所示: +----+----------+----------+------+-------+ | id | name | usertype | read | write | +----+----------+----------+------+-------+ | 1 | test | A | 0 | 0 | | 2 | test | MU | 1 | 1 | | 3 | test

我有一个权限/特权表,如下所示:

+----+----------+----------+------+-------+
| 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种用户类型:管理员、MU维护用户、U标准用户 用户类型是分层的:A>MU>U

用户类型保存为数据库中的CHAR2,不幸的是我无法更改它

现在,我想构建一个实现我的用户类型的层次逻辑的查询

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
e、 g.用户类型“A”没有权限读取或写入名为“test”的内容,因此用户类型“MU”和“U”也应该没有权限读取或写入,并且应该忽略它们的read=1和write=1

我知道当前登录的用户类型。 我想,我必须检查所有层次结构的前辈对名称的最小读/写权限。但我不知道如何检查,因为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

这似乎有效,但我不知道如何获得usertype的条件这就是我解决问题的方法:

一,。我向数据库中添加了另一个表权限组:

2.然后,我将此表加入到我在问题中显示的原始表权限中: 在这里,我通过一个子查询获得permission_groups表的值。此值表示不同用户类型的层次顺序

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_usertype在我的例子中是一个PDO参数,它被当前用户的usertype替换。

您的类型在权限方面至少按字母顺序排列,因此简单的字符串比较将为您提供适当的排名。当然,如果情况并非总是如此,您可以添加“S”-超级用户,此时您可能需要切换到数字system@MarcB在我的实际表格中,情况并非如此——这只是一个简化的示例。我们可以很容易地为这个简单的案例提供解决方案。我不相信我可以提供一个解决方案,可以扩大到实际问题,但是!我想我现在明白了。我刚刚创建了另一个表,其中每个表都有usertype-code和int值。然后我加入这个表并添加一个子查询。如果有人感兴趣,我将在今天晚些时候或明天添加我的解决方案。