【问题标题】:MYSQL JSON_MERGE and Group ByMYSQL JSON_MERGE 和分组依据
【发布时间】:2016-11-10 17:35:42
【问题描述】:

我有以下数据表

我想做的是GROUP BY 时间戳和JSON_MERGE 对象。我期望的结果如下。

我希望以下查询能够正常工作,但我得到了一个错误

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

我得到的错误是

对本机函数“JSON_MERGE”的调用中的参数计数不正确

【问题讨论】:

    标签: mysql mysql-json


    【解决方案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 |
    +------------------+---------------------+
    

    几个注意事项:

    • 这个sn-p的行为不同于JSON_MERGE(),例如:
      • 当两个或多个属性具有相同的名称时,它们的值是 被覆盖而不是被合并到值数组中
      • 无法将对象与数组合并
    • 提供的解决方案仅适用于作为顶级实体的对象 而不是数组。可以对其进行修改以使用数组。
    • 如果依赖于 JSON 对象的字符串表示开始并且 以大括号 {} 结尾。这可能会在未来的版本中改变 服务器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-17
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多