https://mp.weixin.qq.com/s/YWYbNwPkvZOwjT7UwIKPyw

在做电商项目时,不知你有没有遇到这样的一种情况,mysql数据库中商品表tb_product里面有个字段type,它存储的是商品类型,比如

  • 1:热门推荐
  • 2:精选推荐
  • 3:品牌商品等。
有些商品既属于热门推荐,也属于精选推荐,同时还是品牌商品,系统中type中用 1,2,3 这样的格式存储。这时业务人员希望你帮忙导出今日所有type中有3品牌商品的商品,你会怎么做?这时find_in_set函数就派上用场了。select * from tb_article where find_in_set(‘3‘,type)或许你对find_in_set 这个函数有点陌生,不急,我们看看官网是怎么说的
Returns a value in the range of 1 to N if the string str is in the string list strlist consisting of N substrings. A string list is a string composed of substrings separated by , characters. If the first argument is a constant string and the second is a column of type SET, the FIND_IN_SET() function is optimized to use bit arithmetic. Returns 0 if str is not in strlist or if strlist is the empty string. Returns NULL if either argument is NULL. This function does not work properly if the first argument contains a comma (,) character.
如果字符串str在由N个子字符串组成的字符串列表strlist中,则返回1到N范围内的值。字符串列表是由,个字符分隔的子字符串组成的字符串。如果第一个参数是常量字符串,第二个参数是SET类型的列,则FIND_IN_SET()函数将优化为使用位算术。如果str不在strlist中或strlist是空字符串,则返回0。如果任一参数为NULL,则返回NULL。如果第一个参数包含逗号(,)字符,则此函数无法正常工作。比如SELECT FIND_IN_SET(‘b‘, ‘a,b,c,d‘);结果为 2 因为b 在strlist集合中放在2的位置 从1开始。我们验证下:
  • select FIND_IN_SET(‘1‘, ‘1‘); 返回 1
  • select FIND_IN_SET(‘2‘, ‘1,2‘); 返回2 注意第二个参数是用英文逗号隔开,如果是中文逗号 select FIND_IN_SET(‘2‘, ‘1,2‘); 返回 0
  • select FIND_IN_SET(‘88‘, ‘1‘); 返回0
需要注意的是:select * from tb_user where FIND_IN_SET(id, ‘1,2,3,4,5‘);使用find_in_set函数一次返回多条记录,其中id 是表的字段,然后每条记录分别是id等于1,2,3,4,5的时候,类似in (集合)select * from tb_user where id in (1,2,3,4,5);find_in_set()和like的区别 在mysql中,我们在做数据查询时,需要得到某字段中包含某个值的记录,我们时常会用like来处理,但like也有局限,使用like可能查到我们达不到我们的预期,而find_in_set()函数在某些方面它比like更精准。下面来看一个例子创建表并插入语句:CREATE TABLE `tb_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(50) NOT NULL COMMENT ‘用户姓名‘,
`roles` varchar(100) NOT NULL COMMENT ‘用户角色‘,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO tb_user(user_name, roles) VALUES(‘小爱‘,‘1,2,3,8,88‘);
INSERT INTO tb_user(user_name, roles) VALUES(‘小洪‘,‘1,108‘);
INSERT INTO tb_user(user_name, roles) VALUES(‘测试‘,‘2,108‘);
INSERT INTO tb_user(user_name, roles) VALUES(‘peng‘,‘100,101‘);
其中roles表示用户所拥有的角色(以英文逗号分隔),现在想查询拥有角色编号为8的用户,如果用like关键字的话,则查询结果如下:SELECT * FROM tb_user WHERE roles LIKE ‘%8%‘;

https://mp.weixin.qq.com/s/YWYbNwPkvZOwjT7UwIKPyw

细心的你会发现,小洪这个用户不具有角色‘8‘,但也查出来了,这明显不符合我们的预期。下面我们用mysql 函数find_in_set()来查看。SELECT * FROM tb_user WHERE FIND_IN_SET(8,roles);

https://mp.weixin.qq.com/s/YWYbNwPkvZOwjT7UwIKPyw

?

从查询结果看,符合我们的预期。注意:mysql字符串函数 find_in_set(str1,str2)函数是返回str2中str1所在的位置索引,str2必须以英文逗号","分割开。总结 like是模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询的结果要小于like查询的结果。文章使用的mysql版本 5.7。由于笔者水平有限,文中纰漏之处在所难免,权当抛砖引玉,不妥之处,请大家批评指正。

https://mp.weixin.qq.com/s/YWYbNwPkvZOwjT7UwIKPyw

上一篇:VideoJS播放hls视频


下一篇:hdfs文件上传