sql >> Database teknologi >  >> RDS >> Mysql

MySQL aggregeret sum af JSON-objekter

Opdatering:Okay

For det første vil jeg helt klart anbefale at normalisere dataene en smule. Har du prøvet kun at gemme objekterne i kolonnen med detaljer? Hvis du havde brug for at gemme grupper af data med hver prøve-id, kan du bruge en relaterende tabel. IE:)

Eksempel

id int automatisk stigning

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

Detaljer

sample_id intrecord json

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

Udfyld dine data

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"}');
 

Så kan du gøre sådan noget som

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

Resultater

+---------------------------------------------------------------------+ | (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} | +---------------------------------------------------------------------+

Hvis du ikke vil (eller ikke kan) bruge et normaliseret datasæt, kan du måske overveje at skrive en lagret procedure, der går over dine detaljerede kolonner og samler dataene for hver enkelt, med en forespørgsel, der samler de to datasæt.



  1. Sådan falder du bordet i oracle

  2. Overvågning af Percona Server til MySQL - Key Metrics

  3. Bedste måde at gemme et mange-til-mange forhold i MySQL?

  4. MySQL – MINDSTE og STØRSTE sammenligningsoperatører