我有几个数据库与1000个联系人,并希望删除所有重复的记录。我目前的Sql查询运行良好(在记录中-- tel、email、name1被复制时)。查询删除具有较低id的重复项,然后最后发生记录。但在某些情况下,记录中的另一个字段已经填入(重要字段将由标题和name2填写)。我想要实现的是mysql检查这些字段是否已填写,并且只保留记录中的大部分信息。
我的疑问
<?php
$del_duplicate_contacts = $mysqli->query("
DELETE ca
FROM contacts ca
LEFT JOIN
(
SELECT MAX(id) id, name1, tel, email
FROM contacts
GROUP BY name1, tel, email
) cb ON ca.id = cb.id AND
ca.name1 = cb.name1 AND
ca.tel = cb.tel AND
ca.email = cb.email
WHERE cb.id IS NULL
");
?>表的例子:
ID title name1 name2 tel email
1 John 01234 1@1.com
2 Mr John Smith 01234 1@1.com
3 John 01234 1@1.com我的查询将删除记录1和2。我只想保留nr 2和删除1和3。我如何做到这一点?是可能的吗?或者我应该参与PHP,如果是的话,我该怎么做呢?
发布于 2016-08-04 05:57:13
OOPS --这是我迄今得出的最糟糕的答案--警告最上面的部分是危险的,不知道为什么我没有包含任何组--请继续到底部,它现在正在工作:。
DELETE FROM contacts WHERE ID IN (
SELECT ID FROM (
SELECT DISTINCT a.ID
FROM contacts AS a
JOIN contacts AS b
ON a.name1 = b.name1
AND a.tel = b.tel
AND a.email = b.email
ORDER BY a.name1 DESC, a.name2 DESC, a.title DESC
LIMIT 1,100000
) AS tmp
)限制必须为1,xxxx -而不是0,xxxx以保留第一个未删除的
由于不能直接从子查询中的同一表中删除,因此只需添加掩码层,因此它现在正在测试工作。
在删除之前,请始终反复检查要删除的内容:
SELECT * FROM contacts WHERE ID IN (
SELECT ID FROM (
SELECT DISTINCT a.ID
...
LIMIT 1,100000
) AS tmp
)对损坏表示歉意,幸运的是你在一个测试数据库上做了
=====================================
下面是正确的解决方案:
让我们检查一下测试表中的内容:

根据问题,我们注意到只有#2 #4 #5是好的保持。其结果是:

我们希望删除上述列表中没有的任何记录,在删除之前,我们将检查将要删除的内容:

我们准备删除:

下面是SQL,确保您首先测试db:
DELETE FROM contacts WHERE ID NOT IN (
SELECT * FROM (
SELECT ID FROM (
SELECT * FROM contacts ORDER BY title DESC, name1 DESC, name2 DESC, tel DESC, email DESC
) AS tmp
GROUP BY name1, tel, email
) AS del
)发布于 2016-08-04 06:51:43
我已经找到了解决方案,使用的是NOT子句,而不是IN。
DELETE FROM contacts
WHERE NOT EXISTS (
SELECT 1 FROM (
SELECT * FROM (
SELECT * FROM contact AS tmp ORDER BY title DESC, name1 DESC, name2 DESC, email DESC, tel DESC )
as tbl group by name1)
as test WHERE contact.id= test.id
)发布于 2016-08-04 07:52:57
此查询将在没有任何订购选项的情况下工作!
DELETE FROM contacts where ID NOT IN (
SELECT ID FROM ( Select A.ID from contacts as A
join contacts AS B
ON A.name1 = B.name1
AND A.name2 = B.name2
AND A.tel = B.tel
AND A.email = B.email) As mytry);https://stackoverflow.com/questions/38759018
复制相似问题