sql >> Database >  >> RDS >> Mysql

MySQL geaggregeerde som van JSON-objecten

Bijwerken:Oke

Ten eerste zou ik zeker aanraden om de gegevens een beetje te normaliseren. Heb je geprobeerd om alleen de objecten in de detailkolom op te slaan? Als je groepen gegevens met elk monster-ID moet opslaan, kun je een gerelateerde tabel gebruiken. IE :)

Voorbeeld

id int automatisch verhogen

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

Details

sample_id intrecord json

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

Vul uw gegevens in

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

Dan kun je zoiets doen als

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 

Resultaten

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

Als u een genormaliseerde gegevensset niet wilt (of kunt) gebruiken, kunt u misschien kijken naar het schrijven van een opgeslagen procedure die uw detailkolommen doorloopt en de gegevens voor elke kolom samenvoegt, met een query die de twee samenvoegt. gegevenssets.



  1. Hoe cbrt() werkt in PostgreSQL

  2. Aanroep naar ongedefinieerde methode Illuminate\\Database\\Schema\\Blueprint::increments()

  3. ScaleGrid lanceert Google Cloud Platform (GCP)-ondersteuning voor beheerde databasehosting

  4. Hoe converteer ik een tijdstempel naar een datum/tijd in MySQL?