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>

相关推荐
游戏开发爱好者835 分钟前
App Store 上传 IPA 自动化,.p8 密钥认证与 CI/CD 接入实战
android·运维·ci/cd·小程序·uni-app·自动化·iphone
鬼手点金1 小时前
Scrapy + Playwright 完整示例(JS 动态渲染网页)
开发语言·javascript·爬虫·python·scrapy·html·json
游戏开发爱好者82 小时前
iOS 推送怎么配置,APNs 推送证书、设备库与群发
android·ios·小程序·https·uni-app·iphone·webview
AlfredZhao2 小时前
VS Code 一键美化 JSON:不用安装插件
json
zhanghaha131413 小时前
Python进阶教程:6_JSON 数据解析 —— 新手完全指南
开发语言·python·json
云水一下16 小时前
零基础玩转bWAPP靶场(四十六):XSS - Reflected (AJAX/JSON)
web安全·ajax·json·xss·bwapp·reflected
wxson728217 小时前
【Android视频监控系统技术总结】
android·音视频
hunterandroid18 小时前
[Android 从零到一] LiveData 粘性事件与单次消费:从重复触发到可靠事件总线
android
hunterandroid18 小时前
[Android 从零到一] Android 事件分发机制:从 ACTION_DOWN 到 View 事件消费链路
android