mysql set类型 查询_MYSQLSET字段类型怎么查询

昨天自己在写一个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

AuditSuccess    4       0100

IntentionReached  8       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类型保存权限等数据确实让开发方便清晰了不少哇。

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

<h3>回答1:</h3><br/>find_in_set函数是MySQL中的一个字符串函数,用于在一个逗号分隔的字符串列表中查找一个指定的字符串,并返回其在列表中的位置。例如,find_in_set('a', 'a,b,c,d')将返回1,因为字符串'a'在列表中的第一个位置。 在实际应用中,find_in_set函数通常用于查询某个字段中是否包含指定的值。例如,可以使用以下语句查询包含'apple'的记录: SELECT * FROM fruits WHERE find_in_set('apple', fruits_list) > ; 其中,fruits_list是一个逗号分隔的字符串列表,包含了所有水果的名称。如果某个记录的fruits_list字段中包含了'apple',则该记录将被返回。 需要注意的是,find_in_set函数只能用于逗号分隔的字符串列表,如果列表中使用了其他分隔符,该函数将无法正常工作。 <h3>回答2:</h3><br/>find_in_setmysql中的一种字符串处理函数,用于在指定的字符串中查找指定值是否存在,并返回其在字符串中的位置。该函数可以用于将逗号分隔的字符串的值与另一个值进行比较。其语法如下: find_in_set(str,strlist) 其中,str是要搜索的字符串,strlist是要搜索的逗号分隔的字符串。 比如说,如果我们有一个students表,其中有一个名为hobby的字段,其中记录着每个学生的兴趣爱好,多个兴趣爱好之间用逗号隔开,我们希望查询所有喜欢篮球的学生,可以使用如下的sql语句: select * from students where find_in_set('篮球', hobby) > 0; 该语句会返回所有喜欢篮球的学生的记录。如果使用其他的比较符号,比如=、<、>等,可能会出现查询不正确的情况。 需要注意的是,find_in_set函数的性能比较差,因为要对逗号分隔的字符串进行分割,而且只能进行全文搜索。如果有更好的查询条件,建议使用其他的查询方式进行检索。 <h3>回答3:</h3><br/>MySQL中的find_in_set函数就是用于在指定字段中查找一组值中的某一个值是否存在。在MySQL中,find_in_set的语法如下: find_in_set('要查找的值','要查询字段') 其中,要查询字段必须是逗号分隔的多个值,可以是字符串或数字。 find_in_set函数的返回值是布尔值,如果查找到指定值则返回1,否则返回0。因此,在使用find_in_set函数时,最好将查询结果用IF语句进行判断和排序。 在实际开发中,find_in_set函数通常用于查询带有单选框或多选框的表单数据。例如,假设有一个存储用户兴趣爱好的表格user表,包含两个字段:user_id和interests,而interests字段是一个逗号分隔的字符串,存储用户选择的兴趣爱好。如下: user_id | interests ------- | --------- 1 | 音乐,电影,篮球 2 | 篮球,足球,游戏 3 | 游泳,阅读,旅游 如果想查询所有选择了篮球这个兴趣爱好的用户,则可以使用如下SQL语句: SELECT user_id FROM user WHERE FIND_IN_SET('篮球',interests) > 0; 该SQL语句会返回user_id为1和2的用户,因为他们都选择了篮球作为兴趣爱好。 总结:find_in_set函数是MySQL中非常实用的一个查询函数,可以用于查询带有单选框或多选框的表单数据。需要注意的是,在使用find_in_set函数时,要确保指定的字段是以逗号分隔的多个值,否则查询结果可能会出现错误。同时,在查询结果中需要使用IF语句进行判断和排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值