mysql - 测试给定集合中的所有值是否在 MySQL 查询的 SET 类型字段中打开

标签 mysql query-optimization bit-manipulation

我没有看到在 MySQL 查询中执行此操作的清晰且简单的方法。该架构看起来像:

CREATE TABLE users (
    id VARCHAR(20),
    col SET('read', 'write', 'edit', 'delete'),
);

如果我想查询具有 readwrite 权限的所有用户(无论设置任何其他值),我想出的唯一查询行是:

SELECT id, privs
FROM users WHERE
FIND_IN_SET('read',privs) > 0 AND 
FIND_IN_SET('write',privs) > 0

有没有什么办法可以简化这个过程?像这样的东西:

SELECT id, privs
FROM users WHERE
privs('read' & 'write')

假设,我想使用更复杂的位逻辑,但我想知道工作示例是否是使用 SET 类型时实现此目的的唯一方法。

最佳答案

您的值的存储顺序与创建表语句中的顺序相同。

就您而言:

        decimal   |   binary
read    1         |   0001
write   2         |   0010
edit    4         |   0100
delete  8         |   1000

您可以通过添加 0 来“转换”列来获取十进制值。

因此,要进行读写,您可以这样做:

SELECT id, privs
FROM users 
WHERE
privs+0 = 3;

了解更多信息here.

更新:

privs+0 = 3 将仅返回“读&写”。

正如我所说,无论值多久分配给一个条目,这些值都将按顺序存储。

所以你也可以这样做:

SELECT id, privs
FROM users 
WHERE
privs = 'read,write';

如果您至少想要读和写,甚至可能更多:

SELECT id, privs
FROM users 
WHERE
privs LIKE 'read,write%';

关于mysql - 测试给定集合中的所有值是否在 MySQL 查询的 SET 类型字段中打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10172005/

相关文章:

php - while 循环不打印第一个表单迭代,而是打印其他第一个内容?

java - mysql加载文件数据字符集处理环境是否依赖?

MySQL慢查询优化

结合 uint8_t、uint16_t 和 uint8_t

c - 如何对无符号整型使用算术右移?

c - 将位从一个字节移到一个(数组)

mysql - 如何实现Mailchimp列表+外部数据库列表状态同步?

mysql - Sql 相对数据库用户名

mysql - 使用索引优化 mySQL 数据库

MySQL查询优化