You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL中忽略顺序筛选不重复的JSON数组?

MySQL 8.0 实现JSON数组按元素内容去重(忽略顺序)

针对你需要对存储JSON数组的列去重(仅按元素内容和长度判定唯一性,忽略元素顺序)的需求,在MySQL 8.0.33中可以通过JSON_TABLE配合分组聚合实现,以下是具体方案:

方案一:用排序拼接字符串作为分组键

SELECT ANY_VALUE(ids) AS ids
FROM (
    SELECT 
        t.ids,
        -- 将数组元素拆分后排序,拼接成唯一标识字符串
        GROUP_CONCAT(DISTINCT j.id ORDER BY j.id SEPARATOR ',') AS group_key
    FROM your_table t
    JOIN JSON_TABLE(
        t.ids,
        '$[*]' COLUMNS(id INT PATH '$')
    ) j
    GROUP BY t.ids
) temp
GROUP BY group_key;

逻辑说明:

  1. 内层查询通过JSON_TABLE把每个JSON数组拆分成单行的元素记录;
  2. 用GROUP_CONCAT按元素值排序后拼接成字符串,这样元素内容相同的数组(不管顺序)会生成完全一致的group_key;
  3. 外层按group_key分组,用ANY_VALUE取每组任意一条原JSON数组记录,完成去重。

方案二:用排序后的JSON数组作为分组键

如果更倾向于用JSON格式作为分组依据,可以用JSON_ARRAYAGG生成有序数组:

SELECT ANY_VALUE(ids) AS ids
FROM (
    SELECT 
        t.ids,
        -- 将数组元素拆分后排序,重新聚合成有序JSON数组
        JSON_ARRAYAGG(j.id ORDER BY j.id) AS sorted_ids
    FROM your_table t
    JOIN JSON_TABLE(
        t.ids,
        '$[*]' COLUMNS(id INT PATH '$')
    ) j
    GROUP BY t.ids
) temp
GROUP BY sorted_ids;

注意事项:

  • 替换SQL中的your_table为你的实际表名;
  • 如果数组元素是字符串类型,需要把id INT PATH '$'改为id VARCHAR(255) PATH '$'适配类型;
  • ANY_VALUE函数用于在ONLY_FULL_GROUP_BY模式下合法获取分组内的任意一条记录,符合你“任选其一”的需求。

内容的提问来源于stack exchange,提问作者zsm5833

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 00:12:36