您的位置 首页 php

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 这个函数有点陌生,不急,我们看看官网是怎么说的

 

如果字符串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%'; 

 

81725cdc909b4651b3ae6aba348d32df

 

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

SELECT * FROM tb_user WHERE FIND_IN_SET(8,roles); 

 

7d3cda7db3f3419385b3279b2ef699f1

 

从查询结果看,符合我们的预期。

 

注意:mysql字符串函数 find_in_set(str1,str2)函数是返回str2中str1所在的位置索引,str2必须以英文逗号”,”分割开。

 

9f2e350f-acfa-4456-a4d3-b61d010cd0a6

 

总结:

like是模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询的结果要小于like查询的结果。

 

文章使用的mysql版本 5.7。

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

文章来源:智云一二三科技

文章标题:mysql中find_in_set()函数的使用

文章地址:https://www.zhihuclub.com/76834.shtml

关于作者: 智云科技

热门文章

网站地图