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值。然后我加入这个表并添加一个子查询。如果有人感兴趣,我将在今天晚些时候或明天添加我的解决方案。