MySQL两个集合的比较/交集匹配查询

3 篇文章 0 订阅
2 篇文章 0 订阅

需求:

数据库中存的是字符串数组,然后请求参数又是字符串数组。需要从两个数组中拿出参数进行比较,如果匹配成功就拿出这条数据

例1:
请求参数:1,2,3
数据库存储数据:3,4,5,6
因为这两个集合存在交集 3 所以这条数据匹配成功
例2:
请求参数:1,2
数据库存储数据:4,5,6
因为这两个集合没有任何相同的数据,所以这条数据不匹配

解决方案:

如果此字段是固定长度且不可能重复的主键,例如UUID就可以直接用MySQL的正则表达式 REGEXP来解决
字段名 REGEXP ‘1|2|3’。参考博客
如果你的数据可能会是这样

请求参数:1,2,3
数据库存储数据:501,66,80,90

就无法直接使用REGEXP解决问题,不然这样也算匹配成功,因为501中有一个1,REGEXP并不是全词匹配
此时有三种方案,不考虑效率,只说怎么解决

方案一:REGEXPFIND_IN_SET结合使用

请求参数:22,3
数据库存储数据:1,2,3
-----------------------------------
SELECT '1,2,3' REGEXP '\,(22|3)\,' 
OR FIND_IN_SET(substring_index('1,2,3','\,',1),'22,3')>0 
OR FIND_IN_SET(substring_index('1,2,3','\,',-1),'22,3')>0

解释:通过REGEXP匹配前后都有**,的数据,但因为第一个和最后一个有一边没有,**所以就用FIND_IN_SET单独查询两边的数据是否匹配

方案二:改变数据库存储的数据格式,在每个元素前后都加** , **

请求参数:22,3
数据库存储数据:,1,2,3,
-----------------------------------
SELECT ',1,2,3,' REGEXP '\,(22|3)\,'

解释:因为是匹配前后后有**,的数据,直接在第一个前面和最后一个后面加上,**就无需单独查询了

方案三:切割字符串再用IN匹配

请求参数:3,5,6
数据库存储数据:1,2,3
-----------------------------------
WITH t AS(
	SELECT 
		SUBSTRING_INDEX(SUBSTRING_INDEX('1,2,3',',',help_topic_id+1),',',-1) AS role_code 
	FROM 
		mysql.help_topic 
	WHERE 
		help_topic_id < LENGTH('1,2,3')-LENGTH(REPLACE('1,2,3',',',''))+1
)SELECT IF(COUNT(t.role_code) > 0,TRUE,FALSE) FROM t WHERE t.role_code IN ('3','5','6')

解释:先用字符串切割法SUBSTRING_INDEX把数据切换成一行一行的,用WITH临时表存一下,再用IN的方法判断是否包含

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值