如何在MySQL中查询array<string>类型列含重复值的行
解决MySQL中找出数组列内部存在重复值的行
针对你的需求,假设pay_type列存储的是JSON数组(MySQL中通常用JSON类型实现array<string>),可以通过以下方法找出内部存在重复值的行:
方法:利用JSON_TABLE展开数组并统计
通过JSON_TABLE将数组拆分为多行,对比每个customer_id对应的元素总数与去重后的元素数量,判断是否存在重复:
SELECT f.* FROM Finance f INNER JOIN ( SELECT customer_id FROM Finance JOIN JSON_TABLE( pay_type, '$[*]' COLUMNS(pay_value VARCHAR(255) PATH '$') ) AS split_pay GROUP BY customer_id HAVING COUNT(pay_value) > COUNT(DISTINCT pay_value) ) AS duplicate_rows ON f.customer_id = duplicate_rows.customer_id;
逻辑说明
- JSON_TABLE拆分数组:将
pay_type中的每个数组元素拆分为单独的行,生成包含customer_id和单个支付类型的临时结果集。 - 分组统计对比:按
customer_id分组后,统计该用户的支付类型总数量,以及去重后的数量。如果总数量大于去重后的数量,说明该用户的pay_type数组存在重复值。 - 关联原表获取完整数据:将存在重复的
customer_id与原表关联,返回对应的完整行数据。
注意事项
- 该方法要求MySQL版本为8.0.4及以上,因为
JSON_TABLE是从这个版本开始支持的。 - 如果你的
pay_type是用逗号分隔的字符串(而非JSON数组),可以通过递归CTE拆分字符串后执行类似的统计逻辑。
内容的提问来源于stack exchange,提问作者Kadodo14
相关产品推荐
相关产品推荐

