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