从LEFT JOIN中删除记录仅重复并符合某些标准

时间:2014-10-16 16:18:45

标签: mysql sql duplicates left-join duplicate-removal

我有一个相当大的文件,在使用MySQL将其上传到我的数据库之前,我将其与另一个文件匹配。原始文件是~211k(t1),并且在将其与现有数据库(t2)匹配后返回的匹配大约为300k - 这意味着我必须完成将近90k的记录删除工作我可以上传。

由于我使用LEFT JOIN在名称上匹配它们的第一个查询花了这么长时间,我将结果保存为一个名为matchnew的新表(300k记录,似乎有90k重复或糟糕的比赛)。以下是我加入matchnewt1t2架构的示例:

CREATE TABLE `rnmatchnew` (
  `id1` varchar(255) DEFAULT NULL,
  `first1` varchar(255) DEFAULT NULL,
  `last1` varchar(255) DEFAULT NULL,
  `phone1` varchar(255) DEFAULT NULL,
  `zip1` varchar(255) DEFAULT NULL
  `id2` varchar(255) DEFAULT NULL,
  `first2` varchar(255) DEFAULT NULL,
  `last2` varchar(255) DEFAULT NULL,
  `phone2` varchar(255) DEFAULT NULL,
  `zip2` varchar(255) DEFAULT NULL;

(并且两个ID [id1id2]不匹配 - 它们是来自两个不同数据库的两个唯一标识符。)

现在我通过使用这个简单的查询来查看大多数重复或不匹配的内容:

SELECT *, COUNT(id1)
FROM matchnew
GROUP BY id1
HAVING COUNT(id1) > 1;

我匹配的每个表的优点是附加了不同的唯一标识符(第一个表中为id1,第二个表中为id2,现在matchnew中都存在) - 所以当记录多次出现时应该很容易看到。另外,因为我离开时将两张现有的桌子连在一起得到matchnew,这意味着每张桌子的每个人都有两组数据 - 所以两个名字,两个电话号码,两个地址等等。但是我只做了LEFT JOIN的名字和姓氏,以确保我得到最大的回报,以确保我没有错过任何人,以防他们搬家或我们有不同的电话号码等等。

我的问题是:是否有我可以编写或添加到上述查询的代码,如果符合某个条件,只有表中有多个唯一ID时才会删除行?例如,如果我的id1是1234567并且上面的查询显示最后一列中有三个我,那么我是否可以编写其他代码以删除一个或两个(但不是全部三个)如果我的数据与其他限定符(例如电话号码或邮政编码)不匹配,是重复还是不匹配?

要进一步说明,如果我的id1:1234567与最初的t1匹配的记录与我的名字来自t2的三个人匹配 - 是否有办法删除最多两个例如,如果来自t1的记录与t2中具有相同名称的三个记录之一匹配相同的电话号码,那么行的行数是多少? (我指定“最多两个”的唯一原因是因为这个例子有三个重复 - 如果它们都没有与电话号码匹配,我不想完全失去它们,以防我可以手动做出决定。)

描述的方式比我预期的要复杂得多 - 所以如果我能提供任何进一步的说明,请告诉我!非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您需要先为所有行插入标识列

使用标识列ID,行将如下所示

id   id1    phone1   first1
 1   1      732      t1
 2   1      732      t1
 3   1      732      t2
 4   1      891      t3

查询只删除id为2的行,id1,phone1,first1匹配

我们在phone1,id1上进行分组,如果组合有重复值,那么只保留first1的最大值

DELETE M FROM matchnew M
INNER JOIN (
    SELECT id1, phone1, first1, MAX(id) as id
    FROM matchnew
    GROUP BY id1,phone1,first1
    HAVING COUNT(*) > 1 )T
ON M.id < T.id
AND M.phone1 = T.phone1
AND M.id1 = T.id1
AND M.first1 = T.first1