如何在MySQL中查找三列值均相同的重复数据行
如何在MySQL中查找多列组合的重复值
嘿,我来帮你搞定这个需求!要找出数据表中name、father_name、dob这三列值完全相同的重复记录,用MySQL的分组和筛选就能轻松实现,下面分两步给你说明:
第一步:先定位重复的三列组合
如果你想先看看哪些三列组合存在重复,以及它们重复了多少次,可以用下面的SQL语句:
SELECT name, father_name, dob, COUNT(*) AS duplicate_count FROM your_table_name GROUP BY name, father_name, dob HAVING COUNT(*) > 1;
这段代码的逻辑很简单:
- 用
GROUP BY把name、father_name、dob这三列作为分组依据,把值完全相同的行归为一组 COUNT(*)统计每组包含的行数,别名duplicate_count方便你看重复次数HAVING COUNT(*) > 1筛选出那些行数大于1的组,也就是存在重复的组合
第二步:获取所有重复组合的完整记录
如果需要把这些重复组合对应的所有完整行(包括id、region等其他字段)都列出来,和你示例里的效果一致,推荐用下面两种方法:
方法一:使用子查询+IN子句
这种写法比较直观,容易理解:
SELECT * FROM your_table_name WHERE (name, father_name, dob) IN ( SELECT name, father_name, dob FROM your_table_name GROUP BY name, father_name, dob HAVING COUNT(*) > 1 ) ORDER BY name, father_name, dob;
子查询先找出所有重复的三列组合,外层查询再把包含这些组合的所有行都查出来,最后用ORDER BY把相同组合的行排在一起,方便查看。
方法二:使用JOIN(大数据量更高效)
如果你的表数据量比较大,JOIN的方式通常比子查询更高效:
SELECT t1.* FROM your_table_name t1 JOIN ( SELECT name, father_name, dob FROM your_table_name GROUP BY name, father_name, dob HAVING COUNT(*) > 1 ) t2 ON t1.name = t2.name AND t1.father_name = t2.father_name AND t1.dob = t2.dob ORDER BY t1.name, t1.father_name, t1.dob;
这里先通过子查询生成一个包含重复组合的临时表t2,然后把原表t1和t2通过三列关联,就能筛选出所有重复的完整记录。
⚠️ 别忘了把代码里的your_table_name替换成你实际使用的表名哦!
内容的提问来源于stack exchange,提问作者Dean Ambrose
相关产品推荐
相关产品推荐

