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>

相关推荐
事后不诸葛9 小时前
安卓init.rc解析
android·framework
2401_827560209 小时前
【电脑和手机系统】解锁bl后刷LineageOS与Magisk各模块的安装(七)
android·linux·智能手机
超人也会哭️呀10 小时前
ES 混合检索(文本+向量)中的条件处理陷阱——当权限过滤遇到关键词查询
android·大数据·elasticsearch
zuowei288910 小时前
Laravel10.x重磅升级:8大新特性解析
android
imuliuliang11 小时前
Laravel4.x核心特性全解析
android
草莓熊Lotso13 小时前
【Linux系统加餐】从原理到封装:基于建造者模式实现System V信号量工业级C++封装
android·linux·运维·服务器·网络·c++·建造者模式
程序员煊子18 小时前
用 Cursor 从零搭一个 Compose 本地记账 App:实战记录与源码解析
android·kotlin·compose·cursor
alexhilton20 小时前
面向Android开发者的Google I/O 2026
android·kotlin·android jetpack
私人珍藏库20 小时前
【Android】豆图助手-永久HY-模拟微X~zfb各种截图
android·app·工具·软件·多功能