我想在MySQL数据库中提取重复记录 . 这可以通过以下方式完成:
SELECT address, count(id) as cnt FROM list
GROUP BY address HAVING cnt > 1
结果如下:
100 MAIN ST 2
我想拉它,以便显示每一行是重复的 . 就像是:
JIM JONES 100 MAIN ST
JOHN SMITH 100 MAIN ST
有关如何做到这一点的任何想法?我试图避免做第一个,然后在代码中用第二个查询查找重复项 .
22 回答
Powerlord answer确实是最好的,我建议再做一次更改:使用LIMIT确保db不会超载:
如果没有WHERE和进行连接时使用LIMIT是一个好习惯 . 从小值开始,检查查询的重量,然后增加限制 .
我尝试了为这个问题选择的最佳答案,但它让我感到困惑 . 我实际上只需要在我的 table 上的一个字段上 . 来自this link的以下示例对我来说非常好:
最快的重复删除查询过程:
这将在一个表传递中选择重复,没有子查询 .
此查询可以模拟
Oracle
和SQL Server
中的ROW_NUMBER()
有关详细信息,请参阅我博客中的文章:
MySQL
中模拟 .关键是重写此查询,以便它可以用作子查询 .
使用此查询按 email address 查找重复的用户...
这也将显示有多少重复项,并将在没有连接的情况下对结果进行排序
select address from list where address = any (select address from (select address, count(id) cnt from list group by address having cnt > 1 ) as t1) order by address
内部子查询返回具有重复地址的行,然后外部子查询返回具有重复项的地址的地址列 . 外部子查询必须只返回一列,因为它用作运算符'= any'的操作数
查找重复地址要比看起来复杂得多,特别是如果您需要准确性 . 在这种情况下,MySQL查询是不够的......
我在SmartyStreets工作,我们在那里处理验证和重复数据删除以及其他问题,我看到了很多类似问题的各种挑战 .
有几个第三方服务会在列表中标记重复项 . 仅使用MySQL子查询执行此操作不会考虑地址格式和标准的差异 . USPS(针对美国地址)具有制定这些标准的某些指导原则,但只有少数供应商获得认证才能执行此类操作 .
因此,我建议您最好的答案是将表格导出为CSV文件,然后将其提交给有能力的列表处理器 . 其中一个就是LiveAddress,可以在几秒到几分钟内自动完成 . 它将使用名为"Duplicate"的新字段标记重复行,并在其中标记
Y
.为什么不只是INNER加入表自己?
如果地址可以存在两次以上,则需要DISTINCT .
个人这个查询已经解决了我的问题:
此脚本的作用是显示表中不止一次存在的所有订户ID以及找到的重复项数 .
这是表格列:
希望它对你有帮助!
这不容易:
?
不会非常有效,但它应该工作:
这是您要求的类似查询,其200%的工作也很容易 . 请享用!!!
将 city 替换为您的表格 . 将 name 替换为您的字段名称
我们可以发现重复项也取决于多个字段 . 对于这些情况,您可以使用以下格式 .
另一种解决方案是使用表别名,如下所示:
在这种情况下你真正做的就是获取原始列表,创建两个 p 1和 p 2 - 然后在地址列(第3行)上执行连接 . 第4行确保同一记录不会在您的结果集中多次显示("duplicate duplicates") .
对于你的 table ,它会是这样的
此查询将为您提供列表中的所有不同地址条目...如果您有任何名称的主键值等,我不知道这将如何工作 .