2016-11-10 3 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 и , заканчивающееся на фигурные скобки {}. Это может измениться в будущих версиях сервера.