在做电商项目时,不知你有没有遇到这样的一种情况,mysql数据库中商品表tb_product里面有个字段type,它存储的是商品类型,比如
- 1:热门推荐
- 2:精选推荐
- 3:品牌商品等。
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%‘;
细心的你会发现,小洪这个用户不具有角色‘8‘,但也查出来了,这明显不符合我们的预期。下面我们用mysql 函数find_in_set()来查看。SELECT * FROM tb_user WHERE FIND_IN_SET(8,roles);
?
从查询结果看,符合我们的预期。注意:mysql字符串函数 find_in_set(str1,str2)函数是返回str2中str1所在的位置索引,str2必须以英文逗号","分割开。总结 like是模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询的结果要小于like查询的结果。文章使用的mysql版本 5.7。由于笔者水平有限,文中纰漏之处在所难免,权当抛砖引玉,不妥之处,请大家批评指正。