MYSQL JSON_MERGE和Group By

时间:2016-11-10 17:35:43

标签: mysql mysql-json

我有以下数据表

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 个答案:

答案 0 :(得分: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对象的字符串表示开头和 以大括号{}结尾。这可能在将来的版本中发生变化 服务器。