MySQL JSON字段查询:如何筛选包含指定数组3个以上元素的记录?
实现JSON数组包含指定元素数量的筛选查询
需求说明
从combinations表的JSON字段combination中,筛选出包含数组["1","2","3","4","5","6"]里3个及以上元素的所有记录。
示例数据
["1","2","3","9","4","2"]→ 符合筛选条件(包含1、2、3)["4","5","6","10","11","12"]→ 符合筛选条件(包含4、5、6)["1","2","3","4","20","21"]→ 符合筛选条件(包含1、2、3、4)["1","2","21","22","23","24"]→ 不符合筛选条件(仅包含1、2)
问题分析
你之前尝试的多json_contains拼接方式,只能固定检查是否包含某几个特定元素,无法灵活统计匹配元素的数量是否达到3个及以上,需要用拆分数组+统计的方式实现。
解决方案
MySQL 实现
利用JSON_TABLE将JSON数组拆分为单行数据,再统计匹配目标元素的去重数量:
SELECT c.* FROM combinations c JOIN JSON_TABLE( c.combination, '$[*]' COLUMNS(val VARCHAR(10) PATH '$') ) j WHERE j.val IN ('1','2','3','4','5','6') GROUP BY c.id -- 替换为你的表主键或所有字段 HAVING COUNT(DISTINCT j.val) >= 3;
PostgreSQL 实现
通过jsonb_array_elements_text拆分JSON数组,再进行统计:
SELECT c.* FROM combinations c JOIN LATERAL jsonb_array_elements_text(c.combination::jsonb) j(val) ON true WHERE j.val IN ('1','2','3','4','5','6') GROUP BY c.id -- 替换为你的表主键或所有字段 HAVING COUNT(DISTINCT j.val) >= 3;
说明
- 拆分JSON数组后,筛选出属于目标集合的元素,通过
COUNT(DISTINCT)避免重复元素影响统计结果 - 分组时需使用表的主键或所有字段,确保每条原记录只被统计一次
内容的提问来源于stack exchange,提问作者user21679533
相关产品推荐
相关产品推荐

