mysql 中 find_in_set() 查询出可变字段用逗号分隔的目标

本文介绍如何使用MySQL中的find_in_set函数进行精确匹配查询,对比like操作符,find_in_set提供更高效的查询方式,特别是在处理以逗号分隔的字符串字段时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候我们在设计数据库时有以下情况,如:

在视频表中有个字段week, 他存储的是视频在周几播放,如某视频只在周1,4,6播放,那么week字段对应的值以 1,4,6 的格式存储

那们我们要用sql查找所有视频中周4可以播放的视频 (这个时候不是用like能解决的,使用like可能查到我们不想要的记录)

这时就需要 find_in_set()

mysql手册中find_in_set函数的语法:

FIND_IN_SET(str,strlist) 

假如字符串str 在由N 子链组成的字符串列表strlist 中,则返回值的范围在 1N 之间。一个字符串列表就是一个由一些被‘,'符号分开的自链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则 FIND_IN_SET() 函数被优化,使用比特计算。如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL

mysql> SELECT FIND_IN_SET('b','a,b,c,d');
-> 2 

mysql> SELECT *  from video  where find_in_set('4',week); 

like是广泛的模糊匹配,字符串中没有分隔符,find_in_set是精确匹配,字段值以英文”,”分隔,

注意 find_in_set 是全表扫描的

再例如:

如果我们在开发中个,需要取出指定的某些信息,可以通过 {dede:arclist flag=’h’} ,扩展使用,就是可以把管理员 推荐或是置顶的信息,取出.
在mysql中,我们经常有这样一个需求:比如:


friendlist表


id    name     friendsList 
1    aaa       11,112,113
2    bbb       123,3112


需求是: 请查询出好友包含  11的这个用户id


想法:

select * from friendlist where friendList like ‘%11%’;
实际我们可以这样解决
select * from friendlist where find_in_set(‘11’,friendList);




<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、付费专栏及课程。

余额充值