MySQL嵌套JSON查询问题:如何筛选包含指定编号马匹的赛事记录
问题原因及解决方法
你的核心问题是针对JSON数组的查询方式错误:$.horses.number会返回一个包含所有马匹编号的JSON数组(比如你的示例数据会返回["6","5","2","7","9"]),直接和单个值2比较时,数组与单个值无法匹配,所以没有结果。
以下是几种正确的查询方式:
方法1:使用JSON_CONTAINS(最简洁)
直接检查horses数组中是否包含指定的JSON对象:
SELECT * FROM races WHERE JSON_CONTAINS(data->'$.horses', '{"number": "2"}');
注意:原数据中number是字符串类型,所以要传入字符串"2"而非数字2,保证类型匹配。
方法2:使用JSON_SEARCH
通过搜索值是否存在来筛选:
SELECT * FROM races WHERE JSON_SEARCH(data, 'one', '2', NULL, '$.horses[*].number') IS NOT NULL;
JSON_SEARCH会返回匹配值的JSON路径,若返回非空则说明存在目标马匹编号。
方法3:使用JSON_TABLE展开数组(适合需进一步处理马匹数据的场景)
将JSON数组转换为虚拟表,再进行筛选:
SELECT r.* FROM races r JOIN JSON_TABLE( r.data->'$.horses', '$[*]' COLUMNS (horse_number VARCHAR(10) PATH '$.number') ) AS ht WHERE ht.horse_number = '2';
内容的提问来源于stack exchange,提问作者jimbeeer
相关产品推荐
相关产品推荐

