怎样在MySQL中根据JSON数组内容进行分组_使用JSON_TABLE函数展平数据

夏杰姑娘_9099

夏杰姑娘_9099

2026-04-26

909人浏览

原创

json_table是唯一能真正展开json数组为多行的函数,需用'$[*]'路径遍历数组元素,并在columns中明确定义字段名、类型及提取路径,否则无法实现分组等关系型操作。

怎样在mysql中根据json数组内容进行分组_使用json_table函数展平数据

JSON_TABLE 是唯一能真正“展开” JSON 数组的函数

MySQL 5.7+ 支持 JSON 类型,但 JSON_EXTRACT 只能取值,不能把一个 [{"a":1},{"a":2},{"a":1}] 变成三行;只有 JSON_TABLE 能做到真正的“行化”——它把数组每个元素映射为一行,后续才能用 GROUP BY。不走这一步,所有分组都是假分组(比如对整个 JSON 字符串 hash 分组)。

必须用 '$[*]' 路径 + 显式 COLUMNS 定义结构

常见错误是只写 JSON_TABLE(json_col, '$') 或漏掉 COLUMNS,结果返回空或报错 Invalid JSON path expression。正确写法必须包含两部分:

  • '$[*]':表示遍历根数组的每个元素(不是 '$',也不是 '$.items[*]' 除非你确定字段名是 items)
  • COLUMNS(...):显式声明要提取哪些字段、类型和路径,例如 name VARCHAR(50) PATH '$.name'
  • 如果数组元素是纯值(如 ["a","b","a"]),要用 value VARCHAR(50) PATH '$',不能写 '$.name'

分组前务必确认数据可比性:NULL 和类型要一致

JSON_TABLE 展开后,若某元素缺失 name 字段,对应行该列就是 NULL;而 NULL 在 GROUP BY 中会被单独归为一组。更隐蔽的问题是类型隐式转换:

Browser Js
Browser Js

轻量级CDP浏览器控制,适用于AI代理。相较于内置浏览器工具,token消耗降低3‑10倍,仅在浏览时使用。

下载
  • 写 age INT PATH '$.age',但实际 JSON 里存的是字符串 "25" → 该行 age 变成 0,和真数字 25 不同组
  • 写 status VARCHAR(10) PATH '$.status',但有的值是 true → MySQL 转成 "1",和字符串 "active" 完全无关
  • 建议先用 SELECT ... FROM JSON_TABLE(...) WHERE jt.name IS NOT NULL 看一眼展开结果,再加 GROUP BY

性能关键:虚拟列 + 索引能避免每次解析

如果高频查询固定路径(如总是按 $.variant_id 分组),不要每次都调 JSON_TABLE。直接在表上加虚拟列并建索引:

ALTER TABLE orders ADD COLUMN variant_id INT AS (JSON_EXTRACT(order_summary, '$.products[0].variant_id')) STORED;
CREATE INDEX idx_variant_id ON orders(variant_id);

注意:STORED 才能建索引;[0] 只适用于单元素场景;若要取数组中所有 variant_id,仍得靠 JSON_TABLE ——虚拟列无法表达“每个数组元素”。

最易被忽略的一点:JSON 数组长度影响 JSON_TABLE 性能,100 元素的数组会生成 100 行,再分组就变成聚合大表。上线前务必用 EXPLAIN FORMAT=TREE 看执行计划里有没有 JSON_TABLE 的物化步骤,以及是否触发临时表或 filesort。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2213

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1359

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

795

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3052

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5148

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1159

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5411

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4742

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6294

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 187人学习