如何在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;
逻辑说明:
- 内层查询通过
JSON_TABLE把每个JSON数组拆分成单行的元素记录; - 用
GROUP_CONCAT按元素值排序后拼接成字符串,这样元素内容相同的数组(不管顺序)会生成完全一致的group_key; - 外层按
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
相关产品推荐
相关产品推荐

