Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql-如何合并两个json字符串数组而不重复?_Mysql - Fatal编程技术网

Mysql-如何合并两个json字符串数组而不重复?

Mysql-如何合并两个json字符串数组而不重复?,mysql,Mysql,如果我在mysql中有两个json字符串数组,是否有本机(或非本机)方法将这两个数组合并为一个具有唯一字符串的数组? 如果我尝试json\u merge我会得到以下重复结果: set@array1=JSON_EXTRACT('[“苹果”、“梨”、“香蕉”]'、'$); set@array2=JSON_EXTRACT('[“梨”、“香蕉”、“苹果”、“猕猴桃”]'、'$); 选择json_merge(@array1,@array2); >[“苹果”、“梨”、“香蕉”、“梨”、“香蕉”、“苹果”、“

如果我在mysql中有两个json字符串数组,是否有本机(或非本机)方法将这两个数组合并为一个具有唯一字符串的数组? 如果我尝试
json\u merge
我会得到以下重复结果:

set@array1=JSON_EXTRACT('[“苹果”、“梨”、“香蕉”]'、'$);
set@array2=JSON_EXTRACT('[“梨”、“香蕉”、“苹果”、“猕猴桃”]'、'$);
选择json_merge(@array1,@array2);
>[“苹果”、“梨”、“香蕉”、“梨”、“香蕉”、“苹果”、“猕猴桃”]
如果是try
json\u merge\u preserve
则给出相同的结果:

set@array1=JSON_EXTRACT('[“苹果”、“梨”、“香蕉”]'、'$);
set@array2=JSON_EXTRACT('[“梨”、“香蕉”、“苹果”、“猕猴桃”]'、'$);
选择json_merge_preserve(@array1、@array2);
>[“苹果”、“梨”、“香蕉”、“梨”、“香蕉”、“苹果”、“猕猴桃”]
是否有返回唯一数组的函数

["apple",  "banana", "pear", "kiwi"]
编辑:
json\u merge\u patch
不起作用,因为它仅用第二个数组替换第一个数组:

set@array1=JSON_EXTRACT('[“苹果”、“葡萄”、“香蕉”]'、'$);
set@array2=JSON_EXTRACT('[“梨”、“香蕉”、“苹果”、“猕猴桃”]'、'$);
选择json_merge_补丁(@array1、@array2);
>[“梨”、“香蕉”、“苹果”、“猕猴桃”]

在这种情况下,我丢失了
“grape”
。我相信补丁中的逻辑是
0:val',1:val2'
0:val3
合并,然后
0:val3',1:val2'
根据文档,json\u merge\u保留重复项。此外,如果您使用的是MySQL 8.0.3或更高版本,则不推荐使用json_merge,而应使用json_merge_preserve。我认为您需要使用JSON\u MERGE\u补丁


经过深思熟虑,这里有更多的细节,感谢@lefred。我找到了一个可以实现这一点的黑客。 这是太黑客了,但我会发布它,而其他人来了一个更好的实现或mysql的家伙为这做一个适当的功能

首先,我们策略性地替换字符串以创建json对象而不是数组。 然后,我们使用
json\u merge\u path
,最后使用
json\u keys
获得一个数组:V

set@array1='[“苹果”、“葡萄”、“香蕉”、“香蕉”、“梨”];
set@array2='[“梨”、“香蕉”、“苹果”、“猕猴桃”、“香蕉”、“苹果”];
设置@aux1=REPLACE(REPLACE(REPLACE(@array1;
设置@aux2=REPLACE(REPLACE(REPLACE(@array2;
选择@aux1、@aux2;
选择json密钥(json合并补丁(json提取(@aux1,'$)、json提取(@aux2,'$))
>[“猕猴桃”、“梨”、“苹果”、“葡萄”、“香蕉”]

如果这个问题仍然存在,下面是一个使用MySQL 8.0的
JSON\u表的简单解决方案

set @a1 ='["apple","grape","banana","banana","pear"]';
set @a2 ='["pear","banana","apple","kiwi","banana","apple"]';

select fruit
from json_table(
  json_merge_preserve(@a1, @a2),
  '$[*]' columns (
    fruit varchar(255) path '$'
  )
) as fruits
group by fruit; # get distinct values

# gives
apple
grape
banana
pear
kiwi
要获得一行响应,我们必须放弃
分组方式
,并获得更多的创造性

不幸的是,
JSON_ARRAYAGG
不支持
distinct
指令,因此我们必须使用
GROUP_CONCAT

选择组_concat(不同的水果)
从json_表(
json_merge_preserve(@a1、@a2),
“$[*]”列(
水果varchar(255)路径“$”
)
)作为果实;
#没有分组指令!
#给:苹果,香蕉,葡萄,猕猴桃,豌豆
为了获得正确的json数组在线响应,我们只需使用
CONCATs

选择cast(
海螺(“[”,组_海螺(独特的水果分离器“,”),“])
作为json)
...
#给出:[“苹果”、“香蕉”、“葡萄”、“猕猴桃”、“梨”]

编辑:

我找到了一个合适的
JSON_ARRAYAGG
解决方案,使用一个嵌套的虚拟表对
结果进行分组

select json_arrayagg(fruit)
from (
  select fruit
  from json_table(
    json_merge_preserve(@a1, @a2),
    '$[*]' columns (
      fruit varchar(255) path '$'
    )
  ) as fruits
  group by fruit -- group here!
) as unique_fruits;

阅读我的:)

使用选择不同的:

set @array1 =JSON_EXTRACT('["apple","grape","banana"]', '$');
set @array2 =JSON_EXTRACT('["pear","banana","apple","kiwi"]', '$');

select json_arrayagg(fruit) from (
    select 
        distinct fruit 
    from json_table(
        json_merge_preserve(@array1, @array2), 
        '$[*]' columns (fruit varchar(255) path '$')
    ) fruits
) f;

不,这只是用第二个数组替换了第一个数组是的,我现在明白了…你看了吗?这个问题没有答案,但问题本身可能会对你有所帮助。那么,你是说在MySQL中存储json字符串数组是个坏主意吗?这样存储数据有特殊的需要吗?通常很难处理数据这是以这种方式存储的。根据我的经验,这样存储的数据不打算用于操作或过滤器。XDevApi现在支持集合。事实上MySQL支持这一点,请使用工具以更健壮的方式管理json。这是可行的,但它相当丑陋。请参阅我基于json_表的答案。是的,distinct将作为w您缺少返回json数组的
json_arrayagg
,如下所示:
select json_arrayagg(fruit)from(select distinct fruit from json_table(json_merge_preserve(@array1,@array2),“$[*]”列(fruit varchar(255)path“$))fruits)f;