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
相关产品推荐
相关产品推荐

