首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -选择性删除重复记录

问MySQL -选择性删除重复记录
EN

Stack Overflow用户
提问于 2016-08-04 05:21:15
回答 3查看 132关注 0票数 4

我有几个数据库与1000个联系人,并希望删除所有重复的记录。我目前的Sql查询运行良好(在记录中-- tel、email、name1被复制时)。查询删除具有较低id的重复项,然后最后发生记录。但在某些情况下,记录中的另一个字段已经填入(重要字段将由标题和name2填写)。我想要实现的是mysql检查这些字段是否已填写,并且只保留记录中的大部分信息。

我的疑问

代码语言:javascript
复制
<?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

");

?>

表的例子:

代码语言:javascript
复制
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,如果是的话,我该怎么做呢?

EN

回答 3

Stack Overflow用户

发布于 2016-08-04 05:57:13

OOPS --这是我迄今得出的最糟糕的答案--警告最上面的部分是危险的,不知道为什么我没有包含任何组--请继续到底部,它现在正在工作:。

代码语言:javascript
复制
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以保留第一个未删除的

由于不能直接从子查询中的同一表中删除,因此只需添加掩码层,因此它现在正在测试工作。

在删除之前,请始终反复检查要删除的内容:

代码语言:javascript
复制
SELECT * FROM contacts WHERE ID IN (
  SELECT ID FROM (
    SELECT DISTINCT a.ID
    ...
    LIMIT 1,100000
  ) AS tmp
)

对损坏表示歉意,幸运的是你在一个测试数据库上做了

=====================================

下面是正确的解决方案:

让我们检查一下测试表中的内容:

​

​

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

​

​

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

​

​

我们准备删除:

​

​

下面是SQL,确保您首先测试db:

代码语言:javascript
复制
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
)
票数 1
EN

Stack Overflow用户

发布于 2016-08-04 06:51:43

我已经找到了解决方案,使用的是NOT子句,而不是IN。

代码语言:javascript
复制
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 
)
票数 1
EN

Stack Overflow用户

发布于 2016-08-04 07:52:57

此查询将在没有任何订购选项的情况下工作!

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38759018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档