JSON 对象的 MySQL 聚合总和

标签 mysql sql json

我创建了新表并将详细信息作为 JSON 数据类型。我试图获取所有记录的总和。我可以获取每个值,但我不知道如何使用 group by options 获取总和。

CREATE TABLE `Sample` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `details` json DEFAULT NULL,
  PRIMARY KEY (`id`)
)  CHARSET=latin1;

示例数据

 1. [{"id": 1, "name": "T1", "amount": "34.34", "percentage": "45"}, {"id": 3, "name": "T3", "amount": "30.34", "percentage": "45"}, {"id": 2, "name": "T2", "amount": "14.34", "percentage": "15"}]

 2. [{"id": 1, "name": "T1", "amount": "34.34", "percentage": "45"}, {"id": 2, "name": "T2", "amount": "30.34", "percentage": "45"}, {"id": 4, "name": "T4", "amount": "14.34", "percentage": "15"}]

我想要这 2 条记录的聚合组

输出数据

   [{"id": 1, "name": "T1", "amount": "68.68", "percentage": "45"}, {"id": 3, "name"`enter code here`: "T3", "amount": "30.34", "percentage": "45"}, {"id": 2, "name": "T2", "amount": "44.68", "percentage": "60"}, {"id": 4, "name": "T4", "amount": "14.34", "percentage": "15"}]

我尝试使用 JSON_EXTRACT(details, "$[*]") 但没有成功

最佳答案

更新:好的

首先,我肯定会建议对数据进行一些规范化。 您是否尝试过仅将对象存储到详细信息列中? 如果您需要为每个样本 ID 存储数据组,则可以使用关联表。即:)

示例

id 整数自增

mysql> create table Sample (id int(11) not null auto_increment, primary key(id));

详情

sample_id 整数 记录json

mysql> create table Details (sample_id int(11), record json);

填充您的数据

insert into Sample (id) values (1);
insert into Sample (id) values (2);

insert into Details (sample_id, record) values 
  (1, '{"id": 1, "name": "T1", "amount": "34.34", "percentage": "45"}'), 
  (1, '{"id": 3, "name": "T3", "amount": "30.34", "percentage": "45"}'), 
  (1, '{"id": 2, "name": "T2", "amount": "14.34", "percentage": "15"}');

insert into Details (sample_id, record) values 
  (2, '{"id": 1, "name": "T1", "amount": "34.34", "percentage": "45"}'),
  (2, '{"id": 2, "name": "T2", "amount": "30.34", "percentage": "45"}'),
  (2, '{"id": 4, "name": "T4", "amount": "14.34", "percentage": "15"}');

然后你可以做类似的事情

SELECT (
  JSON_OBJECT('id', id, 'amount', amount, 'percentage', percentage)
) FROM (
  SELECT 
    JSON_EXTRACT(record, "$.id") as id, 
    SUM(JSON_EXTRACT(record, "$.amount")) as amount, 
    AVG(JSON_EXTRACT(record, "$.percentage")) as percentage
  FROM Details 
  GROUP BY JSON_EXTRACT(record, "$.id")
) as t 

结果

+---------------------------------------------------------------------+
| (JSON_OBJECT('id', id, 'amount', amount, 'percentage', percentage)) |
+---------------------------------------------------------------------+
| {"id": 1, "amount": 68.68, "percentage": 45}                        |
| {"id": 2, "amount": 44.68, "percentage": 30}                        |
| {"id": 3, "amount": 30.34, "percentage": 45}                        |
| {"id": 4, "amount": 14.34, "percentage": 15}                        |
+---------------------------------------------------------------------+

如果您不想(或不能)使用规范化数据集,那么您可能会考虑编写一个存储过程,该过程循环遍历您的详细信息列并聚合每个列的数据,并使用一个查询聚合两个数据集。

关于JSON 对象的 MySQL 聚合总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49490867/

相关文章:

php - 在有序的 Mysql 查询中获取第 i 到第 j 行

php - cakephp,如何同时保存两个表中的数据

MySQL匹配两个表中的sku,并返回特定行

java - 链接和组合 Jooq 命令

javascript - 从服务器接收对象并将其转换为客户端 Typescript (javascript) 中所需的对象

javascript - 获取和等待后 React 中的 "Cannot read property of undefined"

java - 为什么 DateTime 字段上的 getTimestamp 返回的结果与选择 unix_timestamp 的结果不同?

mysql - "ERROR 1406: 1406: Data too long for column"但它不应该是?

mysql - LIKE 查询中的转义字段

java - Java解析Json如何读取内在值