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

MySQL JSON_CONTAINS查询无结果求助:匹配JSON中volunteertypeid失败

解决JSON字段中筛选指定volunteerTypeID的SQL查询问题

你的查询返回空结果的核心原因是JSON路径使用错误:
示例JSON中event_volunteer_requests是一个JSON对象(键为"1"、"2"这类字符串),而非数组,但你用了数组通配符[*],导致路径无法匹配到任何值,因此JSON_CONTAINS始终返回false。

方法一:使用JSON_SEARCH判断存在性

JSON_SEARCH会返回匹配值的JSON路径,若找到目标值则结果不为null,适合仅需判断存在性的场景:

SELECT
    *
FROM `events`
WHERE `zoneid` = 27 
AND `isactive` = 1 
-- 注意:原JSON中volunteertypeid是数字类型,所以用249而非'249'
AND JSON_SEARCH(`attributes`, 'one', 249, null, '$.event_volunteer_requests.*.volunteertypeid') IS NOT NULL;
  • *是JSON对象的通配符,匹配event_volunteer_requests下的所有子对象
  • 'one'表示只找第一个匹配项,提升查询效率

方法二:用JSON_TABLE展开对象为行(推荐复杂场景)

如果需要对志愿者类型的其他字段(比如volunteer_needed_count)做进一步筛选或关联,用JSON_TABLE将JSON对象转为关系型行数据更灵活:

SELECT
    e.*
FROM `events` e
JOIN JSON_TABLE(
    e.attributes,
    '$.event_volunteer_requests.*' COLUMNS (
        volunteertypeid INT PATH '$.volunteertypeid',
        volunteer_needed_count INT PATH '$.volunteer_needed_count'
    )
) vt
WHERE e.zoneid = 27 
AND e.isactive = 1 
AND vt.volunteertypeid = 249;

方法三:修正原JSON_CONTAINS语句

直接修正路径和参数类型,贴合你最初的写法:

SELECT
    *
FROM `events`
WHERE `zoneid` = 27 
AND `isactive` = 1 
-- 路径改用对象通配符*,参数用数字类型249
AND JSON_CONTAINS(`attributes`, 249, '$.event_volunteer_requests.*.volunteertypeid');

内容的提问来源于stack exchange,提问作者Ripudaman Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:05:16