You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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前后都加上逗号,确保匹配的是完整的元素,而不是元素的一部分。

示例验证

假设你的表数据如下:

keysvalset
121,2,3
245,6,7
354,5,6

执行上述任意方法后,得到的结果是:

keysval
12
35

内容的提问来源于stack exchange,提问作者Shubhi Karamveer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:16:42