首先,我想不出一个合适的标题,欢迎提出建议。
我有一个存储用户和组的数据库。用户可以是多个组的一部分,并且组具有一定的“权限级别”。 Authoritylevel 是一个整数,其二进制形式表示权限(5 是 101,因此您对第一个和第三个选项具有权限,而对第二个则没有权限)。
我进行的查询查找您的权限级别,检查所有组并选择最高权限级别。 但这当然行不通,(如果你有一个组的权限级别 3(110),另一个组的权限级别 5(101),那么你应该有权限级别 7(111),但它会选择最大值,即 5)。 有没有一种方法可以创建一个可以放入查询中的函数,它会在每次找到值时查看二进制表示,然后返回正确的权限级别? (例如 MAX 函数,查看所有找到的值,并比较它们)
当前查询 "SELECT MAX(managementAuthorityLevel) AS lvl FROM user u INNER JOIN CTgroupUser gu on u.ID = gu.user INNER JOIN group
g ON gu.group = g.name WHERE u. ID = :ID;"
:ID 是 PHP PDO 语句参数
logical model
因为这不是我唯一需要它的地方,所以我想在不使用过程的情况下完成它。
感谢阅读
最佳答案
如果我正确理解你的问题,那么你需要一个按位最大值而不是整个数字的最大值。这意味着如果任何组的某个位设置为 1,则结果应为 1。这对应于按位 或
操作。
MySQL有按位聚合函数,包括bit_or() :
Returns the bitwise OR of all bits in expr. The calculation is performed with 64-bit (BIGINT) precision.
If there are no matching rows, BIT_OR() returns a neutral value (all bits set to 0).
因此您可以简单地在包含按用户 ID 分组的访问权限的字段上使用 bit_or()
。
关于记住以前记录的MySQL查询功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51059810/