MySQL组并合并JSON值

时间:2016-01-26 16:24:35

标签: mysql json

我正在使用一些本机JSON字段来存储有关MySQL 5.7.10数据库中某些应用程序实体的信息。我可以为每个“实体”设置“N”行,并且需要将JSON对象汇总并合并在一起,并且任何冲突的键都应该替换而不是合并。我可以通过代码来实现这一点,但如果我能在MySQL中本地有效地完成它,那就更好了。

我尝试使用GROUP_CONCAT和JSON_MERGE的组合,但我遇到了两个问题:

  1. JSON_MERGE不会将GROUP_CONCAT的结果作为有效参数
  2. JSON_MERGE结合了冲突键而不是替换它们。我真正需要的不仅仅是JSON_SET,而是使用'N'个JSON文档而不是“key,value”表示法。
  3. 当前的MySQL JSON实现是否可以实现?

4 个答案:

答案 0 :(得分:0)

JSON值的聚合

  

对于JSON值的聚合,SQL NULL值将与其他数据类型一样被忽略。除MIN(),MAX()和GROUP_CONCAT()外,非NULL值将转换为数字类型并进行聚合。转换为数字应该为数字标量的JSON值产生有意义的结果,尽管(取决于值)可能会发生截断和精度损失。转换为其他JSON值的数量可能不会产生有意义的结果。

我刚刚在mysql docs

中找到了这个

答案 1 :(得分:0)

首先,GROUP_CONCAT只返回一个字符串,因此你必须强制转换它。其次,有一个函数正在执行你想要的JSON_MERGE_PATCH()。请尝试以下方法:

SELECT
    JSON_MERGE_PATCH(
        yourExistingJson,
        CAST(
            CONCAT(
                '[',GROUP_CONCAT(myJson),']'
            )
        AS JSON)
    ) AS myJsonArray
....

刚刚意识到你的版本。您必须升级到5.7.22或更高版本。你的情况有可能吗?如果没有,可能还有其他方式,但它们不会优雅:(

答案 2 :(得分:0)

您可以执行以下操作:

SELECT
    CAST(CONCAT(
        '[',
        GROUP_CONCAT(
            DISTINCT JSON_OBJECT(
                'foo', mytable.foo,
                'bar', mytable.bar
            )
        ),
        ']'
    ) AS JSON) AS myJsonArr
FROM mytable
GROUP BY mytable.someGroup;

答案 3 :(得分:0)

  1. JSON_MERGE不会将GROUP_CONCAT的结果作为有效参数

GROUP_CONCAT给出a,b,c,d,而不是JSON数组。使用JSON_ARRAYAGG(在MySQL 5.7.22中引入),其工作原理与group_concat相似,但是给出了正确的数组["a", "b", "c", "d"],该数组应为JSON函数所接受。

在5.7.22之前,您需要使用变通方法:

cast(
  concat('["',                                    // begin bracket and quote
         group_concat(`field` separator '", "'),  // separator comma and quotes
         '"]'                                     // end quote and bracket
 ) as json
)
  1. JSON_MERGE合并有冲突的密钥,而不是替换它们。我真正需要的是更多的JSON_SET,但使用JSON文档的数量为“ N”而不是“键,值”表示法。

改为使用JSON_MERGE_PATCH,如MySQL 5.7.22中所述。 JSON_MERGEJSON_MERGE_PRESERVE的同义词。

请参见https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html


阅读我的Best Practices for using MySQL as JSON storage