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.