我想在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 id, count(*) as c
FROM 'list'
GROUP BY id HAVING c > 1
这将返回id和该id重复的次数,或者什么都没有,在这种情况下,您将不会有重复的id。
通过(例如:address)更改组中的id,它将返回一个地址由第一个找到的id与该地址重复标识的次数。
SELECT id, count(*) as c
FROM 'list'
GROUP BY address HAVING c > 1
我希望这能有所帮助。喜欢。)
寻找重复地址比看起来要复杂得多,特别是当你要求准确性时。在这种情况下,一个MySQL查询是不够的…
我在SmartyStreets工作,在那里我们解决验证和重复数据删除等问题,我看到过很多类似问题的不同挑战。
有一些第三方服务会在列表中为你标记重复项。仅使用MySQL子查询来执行此操作不会考虑地址格式和标准的差异。美国邮政总局(USPS)有一定的指导方针来制定这些标准,但只有少数供应商获得了执行此类操作的认证。
因此,我建议您最好的答案是,例如,将表导出到CSV文件中,并将其提交给有能力的列表处理程序。其中一个是LiveAddress,它会在几秒钟到几分钟内自动为你完成。它将用一个名为“duplicate”的新字段和一个Y值标记重复的行。
这里的大多数答案不适用于有多个重复结果和/或有多个列要检查重复的情况。当你在这种情况下,你可以使用这个查询来获得所有重复的id:
SELECT address, email, COUNT(*) AS QUANTITY_DUPLICATES, GROUP_CONCAT(id) AS ID_DUPLICATES
FROM list
GROUP BY address, email
HAVING COUNT(*)>1;
如果希望将每个结果作为一行列出,则需要更复杂的查询。这是我发现有效的方法:
CREATE TEMPORARY TABLE IF NOT EXISTS temptable AS (
SELECT GROUP_CONCAT(id) AS ID_DUPLICATES
FROM list
GROUP BY address, email
HAVING COUNT(*)>1
);
SELECT d.*
FROM list AS d, temptable AS t
WHERE FIND_IN_SET(d.id, t.ID_DUPLICATES)
ORDER BY d.id;