myslq 中json 格式的数据如何获取某个属性

举个栗子

产品表中的 attributes 字段是 json格式的数据,我们查询手机的颜色属性来进行一步一步探索。

完整的sql 是这样

复制代码
-- 22. 查询手机的颜色属性
SELECT name, attributes->>'$.color' AS color FROM products
WHERE category_id IN (SELECT id FROM categories WHERE name LIKE '%手机%');

1. 核心:从 products 表取数据

复制代码
SELECT name, attributes->>'$.color' AS color
FROM products
  • name:商品名称(如 "iPhone 15 Pro")

  • attributes:是一个 JSON 类型的列,里面存储了商品的扩展属性,例如:

    复制代码
    {"ram": 8, "color": "黑色", "storage": "256GB"}
  • attributes->>'$.color':是 MySQL 的 JSON 路径操作符

    • ->> 表示 提取 JSON 中某个路径的值,并返回字符串(去掉了 JSON 的引号)。

    • '$.color' 表示 JSON 路径,取顶层 color 键对应的值。

    • 最终结果列别名为 color

例如上面那个 JSON,attributes->>'$.color' 的结果就是字符串 '黑色'


2. 条件:只筛选"手机"类别的商品

复制代码
WHERE category_id IN (
    SELECT id FROM categories WHERE name LIKE '%手机%'
)
  • 子查询 SELECT id FROM categories WHERE name LIKE '%手机%': 从分类表 categories 中找出所有 名字里包含"手机" 的分类的 idLIKE '%手机%' 会匹配 "智能手机"、"手机配件"、"手机" 等。

  • category_id IN (...): 只保留 products 表中 category_id 属于这些分类 ID 的商品。


整体逻辑

  1. 先找到所有名字带"手机"的分类 ID(例如 10)。

  2. 再从商品表中,取出这些分类下的商品,提取 nameattributes 里的 color


结果示例

name color
iPhone 15 Pro 黑色
小米 14 Ultra 白色
... ...

补充说明

  • ->>-> 的区别: -> 返回带引号的 JSON 值(如 "黑色"),->> 返回纯字符串(如 黑色)。

  • 如果某个商品的 attributes 中没有 color 字段,则 color 列返回 NULL

  • 如果 categories 表里匹配到多个 ID,IN 会全部包含。

    mysql> select name,attributes ->> '$.storage' as storage from products where category_id in (select id from categories where name like '%手机%');
    +------------------+---------+
    | name | storage |
    +------------------+---------+
    | iPhone 15 Pro | 256GB |
    | 华为 Mate 60 Pro | 512GB |
    | 小米 14 Pro | 256GB |
    | 三星 S24 Ultra | 512GB |
    | OPPO Find X7 | 256GB |
    | vivo X100 Pro | 256GB |
    +------------------+---------+
    6 rows in set (0.012 sec)

    mysql>
    mysql>
    mysql> select name,attributes ->> '.color' as color,attributes ->> '.storage' as storage from products where category_id in (select id from categories where name like '%手机%');
    +------------------+-------+---------+
    | name | color | storage |
    +------------------+-------+---------+
    | iPhone 15 Pro | 黑色 | 256GB |
    | 华为 Mate 60 Pro | 青色 | 512GB |
    | 小米 14 Pro | 白色 | 256GB |
    | 三星 S24 Ultra | 紫色 | 512GB |
    | OPPO Find X7 | 蓝色 | 256GB |
    | vivo X100 Pro | 白色 | 256GB |
    +------------------+-------+---------+
    6 rows in set (0.013 sec)

    mysql> select name,attributes ->> '.color' as color, '.storage' as storage from products where category_id in (select id from categories where name like '%手机%');
    +------------------+-------+-----------+
    | name | color | storage |
    +------------------+-------+-----------+
    | iPhone 15 Pro | 黑色 | .storage | | 华为 Mate 60 Pro | 青色 | .storage |
    | 小米 14 Pro | 白色 | .storage | | 三星 S24 Ultra | 紫色 | .storage |
    | OPPO Find X7 | 蓝色 | .storage | | vivo X100 Pro | 白色 | .storage |
    +------------------+-------+-----------+
    6 rows in set (0.011 sec)

    mysql>

相关推荐
coderhuo43 分钟前
JibarOS 简介:Android AICore 开源实现方案
android·ai编程
故渊at1 小时前
第十五板块:Android 系统调试与逆向工程 | 第三十六篇:Smali 字节码语义与 Dalvik 指令集
android·指令集·dalvik·smali·字节码语义
J2虾虾1 小时前
Android支持Java语言的标准
android·java·开发语言
charlee441 小时前
Unity在安卓端如何调试输出信息
android·unity·adb·游戏引擎·真机调试
法欧特斯卡雷特1 小时前
从 Kotlin 编译器 API 的变化开始: 2.4.0
android·开源·github
贾艺驰1 小时前
实战Android Framework: 新增一个系统服务
android·源码
火山上的企鹅1 小时前
Codex实战:APP远程升级服务搭建(五)App端远程升级接入
android·服务器·远程升级·qgc
BreezeDove2 小时前
【Android】Flutter3.35项目启动超时问题
android·flutter
故渊at2 小时前
第十四板块:Android 硬件抽象与安全加固 | 第三十四篇:Hardware Composer (HWC) 与 显示安全(HDCP)
android·安全·composer·安全加固·hwc·硬件抽象
KIO no way2 小时前
AI内容编排是什么_聊聊CSDN_AI数字营销背后的分发逻辑
android·人工智能