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 中找出所有 名字里包含"手机" 的分类的 id。 LIKE '%手机%' 会匹配 "智能手机"、"手机配件"、"手机" 等。

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


整体逻辑

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

  2. 再从商品表中,取出这些分类下的商品,提取 name 和 attributes 里的 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>

相关推荐
譕痕2 天前
JSONObject与JSONArray封装数据格式区别
java·json
千里马学框架2 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
A黄俊辉A2 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone2 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc2 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo3 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077003 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone3 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui