sql >> Databáze >  >> RDS >> Mysql

MySQL agregovaný součet objektů JSON

Aktualizace:Dobře

Za prvé bych určitě doporučil data trochu normalizovat. Zkoušeli jste uložit pouze objekty do sloupce podrobností? Pokud jste potřebovali ukládat skupiny dat s každým Sample id, můžete použít související tabulku. IE :)

Ukázka

id int auto increment

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

Podrobnosti

sample_id intrecord json

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

Vyplňte svá 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"}');

Pak můžete udělat něco jako

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 

Výsledky

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

Pokud nechcete (nebo nemůžete) používat normalizovanou datovou sadu, možná byste se mohli podívat na napsání uložené procedury, která bude opakovat sloupce vašich podrobností a agregovat data pro každý z nich, pomocí dotazu, který tyto dva agreguje. datové sady.



  1. PHP Kontrola NULL

  2. Jak zabránit automatickému vypnutí SQL Server LocalDB?

  3. Jak vypsat všechna výchozí omezení se sloupci v databázi SQL Server - SQL Server / Výukový program TSQL část 92

  4. mySQL:znaková sada utf8 v tabulce indexu a chyba duplicitního klíče