Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL tổng hợp các đối tượng JSON

Cập nhật:Được rồi

Đầu tiên, tôi chắc chắn sẽ khuyên bạn nên chuẩn hóa dữ liệu một chút. IE :)

Mẫu

id int tự động tăng

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

Chi tiết

sample_id intrecord json

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

Điền dữ liệu của bạn

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

Sau đó, bạn có thể làm điều gì đó như

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 

Kết quả

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

Nếu bạn không muốn (hoặc không thể) sử dụng tập dữ liệu chuẩn hóa, thì có lẽ bạn có thể xem xét cách viết một thủ tục được lưu trữ lặp lại trên các cột chi tiết của bạn và tổng hợp dữ liệu cho từng cột, với một truy vấn tổng hợp cả hai. bộ dữ liệu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nâng cao thủ tục được lưu trữ không tương thích với sql_mode =only_full_group_by mặc dù sql_mode đang trống

  2. Nhận mysqldump để kết xuất dữ liệu phù hợp với đầu vào psql (dấu ngoặc kép thoát ra)

  3. Cách sử dụng biến điều khiển trong Chế độ xem + cakephp

  4. MySQL nhiều chèn hiệu suất

  5. Cài đặt nhiều phiên bản MySQL trên máy chủ Linux - sử dụng tệp cấu hình MySQL riêng biệt