一、背景
MYSQL版本是8.0.25。
最近在做管理系统的功能,要求设置一些查询条件能够对项目计划做查询。 表中数据示例如下:
assigners列是由多个数字和逗号分隔符组成的。
现在有如下几种查询要求:
- 查询我负责的计划
- 查询多个人负责的计划
二、解决办法
1. FIND_IN_SET函数
1.1 基本用法
FIND_IN_SET(str,strlist),该函数的作用是查询字段(strlist)中是否包含(str)的结果,返回结果为null或记录 。
str 要查询的字符串.
strlist 需查询的字段,参数以”,”分隔,例如如 '1,2,3'.
上面提到的需求一:查询我负责的计划
select * from plan where FIND_IN_SET('myUserId', assigners);
1.2 执行计划
explain select * from pms_fresh_goods pfg where find_in_set('7323220594568', pfg.cate_ids);
可以看到FIND_IN_SET函数走的是全表扫描,不走索引。所以对于大表查询不推荐使用该函数。
2. CONCAT函数+正则表达式REGEXP
1.1 基本用法
CONCAT(str1,str2,…),返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。
上面提到的需求二:查询多个人负责的计划
select * from plan where CONCAT (',',assigners,',') REGEXP ',userId1|userId2|userId3,';
1.2 执行计划
select * from plan where CONCAT (',',assigners,',') REGEXP ',123456789|12256368589|11263698758,';
可以看到CONCAT函数走的是全表扫描,不走索引。所以对于大表查询不推荐使用该函数。