I am trying to combine several rows in a table into a single row based on a condition.
For example, my table like this:
id date name count1 count2 count3
1 2019-01-01 name1 8 10 5
2 2019-01-01 name2 12 5 20
3 2019-01-01 name3 15 5 10
4 2019-01-02 name4 12 5 40
5 2019-01-02 name5 3 5 10
6 2019-01-03 name6 10 2 7
And now, I want to the result of query to look like this:
{
date:"2019-01-01",
name1:{
count1:8,
count2:10,
count3:15
},
name2:{
count1:12,
count2:5,
count3:20
},
name3:{
count1:15,
count2:5,
count3:10
}
},
{
date:"2019-01-02"
name4:{
count1:12,
count2:5,
count3:10
},
name5:{
count1:3,
count2:5,
count3:10
}
},
{
date:"2019-01-03",
name6:{
count1:10,
count2:2,
count3:7
}
}
How do I query a row that converts to json like above
Can someone help me in achieving this?
Source data:
+----+------------+-------+--------+--------+--------+
| id | date | name | count1 | count2 | count3 |
+----+------------+-------+--------+--------+--------+
| 1 | 2019-01-01 | name1 | 8 | 10 | 5 |
| 2 | 2019-01-01 | name2 | 12 | 5 | 20 |
| 3 | 2019-01-01 | name3 | 15 | 5 | 10 |
| 4 | 2019-01-02 | name4 | 12 | 5 | 40 |
| 5 | 2019-01-02 | name5 | 3 | 5 | 10 |
| 6 | 2019-01-03 | name6 | 10 | 2 | 7 |
+----+------------+-------+--------+--------+--------+
Here's a solution in MySQL 5.7:
select json_pretty(json_arrayagg(json_merge_patch(json_object('date', date), names))) as data
from (
select date, json_objectagg(name, counts) as names
from (
select id, date, name,
json_object('count1', count1, 'count2', count2, 'count3', count3) as counts
from mytable group by id, date, name
) as t1 group by date
) as t2\G
Output:
*************************** 1. row ***************************
data: [
{
"date": "2019-01-01",
"name1": {
"count1": 8,
"count2": 10,
"count3": 5
},
"name2": {
"count1": 12,
"count2": 5,
"count3": 20
},
"name3": {
"count1": 15,
"count2": 5,
"count3": 10
}
},
{
"date": "2019-01-02",
"name4": {
"count1": 12,
"count2": 5,
"count3": 40
},
"name5": {
"count1": 3,
"count2": 5,
"count3": 10
}
},
{
"date": "2019-01-03",
"name6": {
"count1": 10,
"count2": 2,
"count3": 7
}
}
]
I created a test table
CREATE TABLE `test` (
`id` INT(11) NULL DEFAULT NULL,
`date` DATE NULL DEFAULT NULL,
`name` CHAR(50) NULL DEFAULT NULL,
`count1` SMALLINT(6) NULL DEFAULT NULL,
`count2` SMALLINT(6) NULL DEFAULT NULL,
`count3` SMALLINT(6) NULL DEFAULT NULL
);
and the closest I get are two posibilities :
SELECT GROUP_CONCAT(DISTINCT date , name,':', JSON_OBJECT("count1", count1,'count2', count2,'count3', count3),'}') FROM test GROUP BY date ORDER BY date;
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GROUP_CONCAT(DISTINCT date , name,':', JSON_OBJECT("count1", count1,'count2', count2,'count3', count3),'}') |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 2019-01-01name1:{"count1": 8, "count2": 10, "count3": 5}},2019-01-01name2:{"count1": 12, "count2": 5, "count3": 20}},2019-01-01name3:{"count1": 15, "count2": 5, "count3": 10}} |
| 2019-01-02name4:{"count1": 12, "count2": 5, "count3": 40}},2019-01-02name5:{"count1": 3, "count2": 5, "count3": 10}} |
| 2019-01-03name6:{"count1": 10, "count2": 2, "count3": 7}} |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
and
SELECT GROUP_CONCAT( DISTINCT date ,JSON_OBJECT(name , JSON_OBJECT("count1", count1,'count2', count2,'count3', count3))) FROM test GROUP BY date ORDER BY date;
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GROUP_CONCAT( DISTINCT date ,JSON_OBJECT(name , JSON_OBJECT("count1", count1,'count2', count2,'count3', count3))) |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 2019-01-01{"name1": {"count1": 8, "count2": 10, "count3": 5}},2019-01-01{"name2": {"count1": 12, "count2": 5, "count3": 20}},2019-01-01{"name3": {"count1": 15, "count2": 5, "count3": 10}} |
| 2019-01-02{"name4": {"count1": 12, "count2": 5, "count3": 40}},2019-01-02{"name5": {"count1": 3, "count2": 5, "count3": 10}} |
| 2019-01-03{"name6": {"count1": 10, "count2": 2, "count3": 7}} |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
it is not 100% what you want but that's all I know
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.