玖叶教程网

前端编程开发入门

mysql中find_in_set()函数的使用(mysql find in set用到索引吗)

在做电商项目时,不知你有没有遇到这样的一种情况,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%';



细心的你会发现,小洪这个用户不具有角色'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。

由于笔者水平有限,文中纰漏之处在所难免,权当抛砖引玉,不妥之处,请大家批评指正。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言