简体   繁体   中英

How to query multiple rows to a single row using MySql?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM