我没有看到在 MySQL 查询中执行此操作的清晰且简单的方法。该架构看起来像:
CREATE TABLE users (
id VARCHAR(20),
col SET('read', 'write', 'edit', 'delete'),
);
如果我想查询具有 read
和 write
权限的所有用户(无论设置任何其他值),我想出的唯一查询行是:
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/