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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:27:15