首页 > 解决方案 > MySQL查询功能,记住以前的记录

问题描述

首先,我想不出一个合适的标题,欢迎提出建议。

我有一个存储用户和组的数据库。用户可以是多个组的一部分,并且组具有一定的“权限级别”。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 groupg ON gu.group = g.name WHERE u.ID = :ID;” 其中 :ID 为 PHP PDO 语句参数 逻辑模型

因为这不是我唯一需要它的地方,所以我想在不使用程序的情况下进行。

谢谢阅读

标签: mysqldatabasefunction

解决方案


如果我正确理解您的问题,那么您需要一个按位最大值,而不是整个数字的最大值。这意味着如果任何组的某个位设置为 1,则结果应为 1。这对应于按位or运算。

MySQL 具有按位聚合函数,其中包括bit_or()

返回 expr 中所有位的按位或。计算以 64 位 (BIGINT) 精度执行。

如果没有匹配的行,BIT_OR() 返回一个中性值(所有位设置为 0)。

因此,您可以简单地bit_or()在包含按用户 ID 分组的访问权限的字段上使用。


推荐阅读