我想在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
有什么想法可以做到吗?我试图避免做第一个,然后在代码中用第二个查询查找重复。
就我个人而言,这个问题解决了我的问题:
SELECT `SUB_ID`, COUNT(SRV_KW_ID) as subscriptions FROM `SUB_SUBSCR` group by SUB_ID, SRV_KW_ID HAVING subscriptions > 1;
这个脚本所做的是在表中显示所有存在过一次以上的订阅者ID,以及找到的重复的数量。
这是表的列:
| SUB_SUBSCR_ID | int(11) | NO | PRI | NULL | auto_increment |
| MSI_ALIAS | varchar(64) | YES | UNI | NULL | |
| SUB_ID | int(11) | NO | MUL | NULL | |
| SRV_KW_ID | int(11) | NO | MUL | NULL | |
希望对你也有帮助!
这将在一次表传递中选择重复项,没有子查询。
SELECT *
FROM (
SELECT ao.*, (@r := @r + 1) AS rn
FROM (
SELECT @_address := 'N'
) vars,
(
SELECT *
FROM
list a
ORDER BY
address, id
) ao
WHERE CASE WHEN @_address <> address THEN @r := 0 ELSE 0 END IS NOT NULL
AND (@_address := address ) IS NOT NULL
) aoo
WHERE rn > 1
这个查询实际上模拟了Oracle和SQL Server中的ROW_NUMBER()
详见我博客上的文章:
分析函数:SUM, AVG, ROW_NUMBER -在MySQL模拟。
寻找重复地址比看起来要复杂得多,特别是当你要求准确性时。在这种情况下,一个MySQL查询是不够的…
我在SmartyStreets工作,在那里我们解决验证和重复数据删除等问题,我看到过很多类似问题的不同挑战。
有一些第三方服务会在列表中为你标记重复项。仅使用MySQL子查询来执行此操作不会考虑地址格式和标准的差异。美国邮政总局(USPS)有一定的指导方针来制定这些标准,但只有少数供应商获得了执行此类操作的认证。
因此,我建议您最好的答案是,例如,将表导出到CSV文件中,并将其提交给有能力的列表处理程序。其中一个是LiveAddress,它会在几秒钟到几分钟内自动为你完成。它将用一个名为“duplicate”的新字段和一个Y值标记重复的行。