2016-11-10 141 views
1

我有数据MYSQL JSON_MERGE和GROUP BY

enter image description here

我所试图做的是GROUP BY时间戳和JSON_MERGE对象如下表所示。我期望的结果如下。

enter image description here

我希望下面的查询工作,但我只是得到一个错误

SELECT timestamp, JSON_MERGE(json) 
FROM data 
GROUP BY timestamp, JSON_MERGE(json) 

我得到的错误是在调用本地函数

不正确的参数个数'JSON_MERGE'

回答

1

使用字符串函数组装所需的JSON,然后将其转换为JSON。

实施例数据

create table data (json json, timestamp datetime); 

insert into data values 
('{"a": 1}', '2016-10-01 00:00:00'), 
('{"b": 2}', '2016-10-01 00:00:00'), 
('{"c": 3}', '2016-10-01 11:11:11'), 
('{}', '2016-10-01 11:11:11'), 
('{"c": 33}', '2016-10-01 11:11:11'); 

查询合并所有json值由时间戳分组

select cast(
    concat('{', -- wrap everything in root object '{ ... }' 
    group_concat(
     -- strip parenthesis from individual item representation 
     -- '{"foo": 1}' -> '"foo": 1' 
     substring(json, 2, length(json) - 2)), 
    '}') as json) json, 
timestamp 
from data 
-- skip empty JSON values to avoid getting extra comma during 
-- group_concat 
where json != JSON_OBJECT() 
group by timestamp; 

查询结果

+------------------+---------------------+ 
| json    | timestamp   | 
|------------------+---------------------| 
| {"a": 1, "b": 2} | 2016-10-01 00:00:00 | 
| {"c": 3}   | 2016-10-01 11:11:11 | 
+------------------+---------------------+ 

若干注意事项:

  • 这个片段的行为是从JSON_MERGE()不同,例如:
    • 当两个或多个属性具有相同的名称及其值是 覆盖,而不是被合并到值数组
    • 它不能合并对象与阵列
  • 作为介绍的解决方案仅适用于对象作为顶级实体 而不是数组。可以修改它以处理数组。
  • 如果依赖于以JSON对象开头的字符串表示形式,并且以大括号{}结尾的 。这可能会在服务器的将来版本 中更改。