我有一个相当大的文件,在使用MySQL将其上传到我的数据库之前,我将其与另一个文件匹配。原始文件是~211k(t1
),并且在将其与现有数据库(t2
)匹配后返回的匹配大约为300k - 这意味着我必须完成将近90k的记录删除工作我可以上传。
由于我使用LEFT JOIN
在名称上匹配它们的第一个查询花了这么长时间,我将结果保存为一个名为matchnew
的新表(300k记录,似乎有90k重复或糟糕的比赛)。以下是我加入matchnew
和t1
后t2
架构的示例:
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 [id1
和id2
]不匹配 - 它们是来自两个不同数据库的两个唯一标识符。)
现在我通过使用这个简单的查询来查看大多数重复或不匹配的内容:
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
中具有相同名称的三个记录之一匹配相同的电话号码,那么行的行数是多少? (我指定“最多两个”的唯一原因是因为这个例子有三个重复 - 如果它们都没有与电话号码匹配,我不想完全失去它们,以防我可以手动做出决定。)
描述的方式比我预期的要复杂得多 - 所以如果我能提供任何进一步的说明,请告诉我!非常感谢你的帮助。
答案 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