如何使用MySQL查询NAME字段重复但KEY字段值不同的记录?
查找MySQL中NAME重复且对应KEY存在差异的记录
我懂你要找的是什么——就是那些NAME字段重复出现,但同一个NAME对应的KEY字段有不一样的值的记录对吧?针对这个需求,我给你两种实用的查询方法,你可以根据自己的具体场景选择:
方法一:先筛选出有差异KEY的NAME,再关联取记录
这种方法先定位到那些存在多种不同KEY值的NAME,再把原表中这些NAME的所有记录都查出来,适合你想看到所有相关记录的场景:
SELECT t.* FROM your_table t JOIN ( -- 先找出有至少两种不同KEY的NAME SELECT NAME FROM your_table GROUP BY NAME HAVING COUNT(DISTINCT `KEY`) > 1 ) problematic_names ON t.NAME = problematic_names.NAME;
逻辑拆解:
- 子查询部分:通过
GROUP BY NAME对NAME分组,用COUNT(DISTINCT \KEY`) > 1来筛选——只要某个NAME对应的KEY值有两种或以上不同的,就会被选中。这里用DISTINCT`是为了排除“同一KEY重复多次”的情况,只判断是否存在不同的KEY。 - 外层查询把原表和子查询的结果关联,就能拿到所有属于这些有问题NAME的记录,也就是你要找的目标数据。
方法二:直接判断每条记录是否存在同NAME不同KEY的其他记录
如果你想直接判断每条记录是否满足“同NAME下有其他不同KEY”的条件,用EXISTS的写法更直观:
SELECT t.* FROM your_table t WHERE EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.NAME = t.NAME AND t2.`KEY` != t.`KEY` );
逻辑拆解:
这个查询会逐条检查原表的记录:如果当前记录的NAME,在表中存在另一条记录和它NAME相同但KEY不同,就把这条记录返回。比如你示例里的ID=0、2、3、4都会被返回,因为它们的NAME是A,且存在其他KEY不同的记录。
注意事项:
因为KEY是MySQL的保留关键字,所以在查询里必须用反引号`把它包起来,不然会触发语法错误哦。
内容的提问来源于stack exchange,提问作者PeeS
相关产品推荐
相关产品推荐

