昨天自己在写一个dedecms功能时突然用到了解dedecms中flag字段,但里面用的是set类型,开始直接查询where = xx 可查出单字符,但是多个是就不好查了,下面我来总结一下set字段查询方法吧。
set可以包含最多64个成员,其值为一个整数。(set类型基础请查阅 mysql数据类型之set类型 )这个整数的二进制码表示该set的值的哪些成员为真。例如有`status` set
代码如下 复制代码
('forsale','authsuccess','auditsuccess','intentionreached','salecanceled'),那么它们的值为:
set member decimal value binary value
-----------------------------
forsale 1 0001
authsuccess 2 0010
auditsuccess4 0100
intentionreached8 1000
如果将9存入status字段,那么其二进制值为1001,也就是说这个值中'forsale'和'intentionreached'为真。
可以想到,如果这样的话,大家可以用like命令和 find_in_set() 函数来检索set值:
代码如下 复制代码
select * from tbl_name where status like '%value%';
select * from tbl_name where find_in_set('value',status)>0;
当然,以下sql语句也是合法的,他们显得更加简洁(注意两个成员的顺序及连接符,):
代码如下 复制代码
select * from tbl_name where status = 'forsale,intentionreached';同时我们还可以直接使用数值来查询:
select * from tbl_name where status = 9
因为set类型的成员的位置都是固定的,数值9永远表示'forsale'和'intentionreached'为真;这样即使以后再添加了一个状态,也不会影响之前的查询逻辑。我们再来看看修改set类型字段的sql语句使用技巧:
修改status让其'forsale'成员为真
代码如下 复制代码
update tbl_name set status = 1 where id = 333
修改status让其'forsale'、'authsuccess'、'intentionreached' 成员为真
代码如下 复制代码
update tbl_name set status = 1 | 2 | 4 where id = 333;
在确认目前状态为7时去掉'forsale'成员,让7也作为操作的条件是确保目前状态就是为7,如果没有此需求可直接 set
代码如下 复制代码
status = 6 ;
update tbl_name set status = 7 & ~1 where id = 333;
呵呵,利用set类型保存权限等数据确实让开发方便清晰了不少哇。
