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>

相关推荐
YF021121 分钟前
Android compose详解
android
IT小码哥丶24 分钟前
Android进阶之事件分发机制深度剖析
android
维天说15 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
执明wa16 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
404_coder16 小时前
源码视角下的 Android 开机流程:从 Zygote、SystemServer 到 Launcher
android
二流小码农16 小时前
鸿蒙开发:以登录案例了解代码架构MVVM
android·ios·harmonyos
用户693717500138417 小时前
从代码生产者到 AI 协作者:软件工程师的角色重构
android·前端·后端
GitLqr17 小时前
别在 Flutter 的 main() 里乱锁屏幕方向,小心 iPad 分屏功能被你搞没了
android·flutter·ios
sg_knight17 小时前
MySQL 存储过程详解:从入门到实战
android·数据库·mysql·database·dba·关系型数据库·db