解读extra-$.multiple 用法SELECTid, user_id, app_order_id, order_no, amount, extra-$.multiple, extra-$.bonusFROMslots-lavish-luck.charge_recordsWHEREid 78785070AND id 80068528AND charge_id IN ( 443, 444, 445, 446, 447, 448 )AND status 3AND extra LIKE %multiple%and extra-$.bonus amountORDER BYid DESCLIMIT 0,100;extra-$.multiple用法详解这是 MySQL 5.7.13 引入的JSON 字段的内联路径提取运算符专门用于操作 JSON 类型的数据列。一、语法拆解extra-$.multiple部分含义extra列名该列的数据类型必须是JSON-JSON 解引用运算符Unquoting JSON extractor$.multipleJSON 路径表达式表示提取 JSON 文档中multiple键对应的值二、等价写法-- 写法1使用 - 运算符简洁 extra-$.multiple -- 写法2使用 JSON_UNQUOTE JSON_EXTRACT功能等价 JSON_UNQUOTE(JSON_EXTRACT(extra, $.multiple)) -- 写法3使用 - 运算符带引号 extra-$.multiple三、-和-的区别运算符返回值示例结果-带双引号的 JSON 字符串100-纯字符串去除引号100-- 假设 extra {multiple: 100, bonus: 50} -- 使用 - SELECT extra-$.multiple; -- 返回 100带引号 -- 使用 - SELECT extra-$.multiple; -- 返回 100纯数字字符串四、在你的 SQL 中的作用extra-$.multiple -- 提取 JSON 字段中 multiple 键的值 extra-$.bonus -- 提取 JSON 字段中 bonus 键的值假设extra列中存储的数据格式如下{ multiple: 2, bonus: 88, source: double_reward, event_id: EVT123456 }则extra-$.multiple→ 返回2extra-$.bonus→ 返回88五、在 WHERE 条件中的应用你的查询中还用到了 JSON 字段的比较AND extra-$.bonus amount这条条件的意思是从 JSON 字段中提取bonus的值并与amount字段进行比较筛选出 bonus 小于 amount 的记录。六、性能注意事项-- 这种方式无法使用索引会触发全表扫描 WHERE extra-$.bonus amount -- 如果要优化可以考虑 -- 1. 创建虚拟列 索引MySQL 5.7 ALTER TABLE charge_records ADD COLUMN bonus_value DECIMAL(10,2) GENERATED ALWAYS AS (extra-$.bonus) STORED, ADD INDEX idx_bonus (bonus_value); -- 2. 然后查询就可以走索引了 WHERE bonus_value amount七、其他常用 JSON 路径操作-- 提取嵌套字段 extra-$.user.info.name -- 提取数组元素 extra-$.items[0] -- 第一个元素 extra-$.items[-1] -- 最后一个元素 -- 提取所有值 extra-$[*] -- 条件判断JSON_CONTAINS JSON_CONTAINS(extra, multiple, $) -- 检查是否存在 multiple 键八、总结extra-$.multiple是一种从 JSON 列中提取指定键的值的高效语法相当于先通过JSON_EXTRACT()提取 JSON 路径的值再用JSON_UNQUOTE()去掉外层引号一句话总结它是 MySQL 为了方便操作 JSON 数据而提供的语法糖让你可以直接在 SQL 中像访问对象属性一样提取 JSON 字段的值。