如何在MySQL中筛选val列值存在于同表set列的记录?
MySQL筛选val存在于同行列set中的记录解决方案
为什么你的原语句不生效
你写的select keys, val from a where val in (set)没法工作,原因很简单:IN是用来匹配一组离散值的(比如IN (1,2,3)),但你的set列是字符串类型的列表(比如逗号分隔的一串值),MySQL会把整个set列的值当成单个字符串,而不是拆分后的集合,自然匹配不到。
解决方法
方法1:用MySQL专属函数FIND_IN_SET(推荐,针对逗号分隔的情况)
MySQL提供了FIND_IN_SET(str, strlist)函数,专门用来处理逗号分隔的字符串列表,它会返回str在strlist中的位置,找到就返回大于0的数字,没找到返回0。
注意set是MySQL的关键字,所以列名要用反引号括起来:
SELECT keys, val FROM a WHERE FIND_IN_SET(val, `set`) > 0;
方法2:如果set列用的是其他分隔符
如果你的set列不是用逗号分隔,比如用竖线|,可以先把分隔符替换成逗号,再用FIND_IN_SET:
SELECT keys, val FROM a WHERE FIND_IN_SET(val, REPLACE(`set`, '|', ',')) > 0;
方法3:用LIKE匹配(兼容更多场景,但要注意边界)
如果不想用专属函数,可以通过拼接分隔符来避免部分匹配的问题(比如防止val=1匹配到set='11,2'这种情况):
SELECT keys, val FROM a WHERE CONCAT(',', `set`, ',') LIKE CONCAT(',', val, ',');
原理是把set和val前后都加上逗号,确保匹配的是完整的元素,而不是元素的一部分。
示例验证
假设你的表数据如下:
| keys | val | set |
|---|---|---|
| 1 | 2 | 1,2,3 |
| 2 | 4 | 5,6,7 |
| 3 | 5 | 4,5,6 |
执行上述任意方法后,得到的结果是:
| keys | val |
|---|---|
| 1 | 2 |
| 3 | 5 |
内容的提问来源于stack exchange,提问作者Shubhi Karamveer
相关产品推荐
相关产品推荐

