mysql - 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 group
g ON gu.group = g.name WHERE u.ID = :ID;” 其中 :ID 为 PHP PDO 语句参数
逻辑模型
因为这不是我唯一需要它的地方,所以我想在不使用程序的情况下进行。
谢谢阅读
解决方案
如果我正确理解您的问题,那么您需要一个按位最大值,而不是整个数字的最大值。这意味着如果任何组的某个位设置为 1,则结果应为 1。这对应于按位or
运算。
MySQL 具有按位聚合函数,其中包括bit_or():
返回 expr 中所有位的按位或。计算以 64 位 (BIGINT) 精度执行。
如果没有匹配的行,BIT_OR() 返回一个中性值(所有位设置为 0)。
因此,您可以简单地bit_or()
在包含按用户 ID 分组的访问权限的字段上使用。
推荐阅读
- php - 没有表单操作的php ajax自动登录
- r - “在窗口中预览”在 RStudio 中不起作用
- c++ - 类中 c struct 的范围创建问题
- sql - SQL Join 在一行的多个列上
- javascript - Javascript如何使用函数match()?
- sql - 将 varchar 值“,”转换为数据类型 int 时转换失败
- java - top res 大于 Xmx
- ios - 如何使用 Swift 中的组替换字符串中的出现?
- mongodb - 为什么默认情况下索引应用于特定列而不是每一列?
- javascript - vb.net GetElementByid 从 Internet Explorer 中已打开的页面