【问题标题】:delete mysql duplicates but keep one [duplicate]删除mysql重复但保留一个[重复]
【发布时间】:2016-09-18 20:41:59
【问题描述】:

我有这个表结构:

+----+-------+
| ID | phone |
+----+-------+
|  3 | 000   |
|  4 | 111   |
|  5 | 111   |
|  8 | 222   |
|  9 | 333   |
+----+-------+

我知道,我可以用这个 sql 显示重复的行:

SELECT * FROM TablePhones GROUP BY phone having count(*) > 1

但我需要一个删除所有重复项但保留 ID 最高的行的 sql 命令。

你能帮帮我吗? :)

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以通过从重复项中获取最大 ID,然后删除不匹配的记录来做到这一点。这是一个例子:

    DELETE FROM TablePhones TP
    INNER JOIN (
      SELECT MAX(id) id, T.phone
      FROM TablePhones T
      INNER JOIN (
        SELECT phone
        FROM TablePhones
        GROUP BY phone
        HAVING COUNT(1) > 1
      ) Subq
      ON T.phone = Subq.phone
    ) SS
    ON TP.phone = SS.phone
      AND TP.ID <> SS.ID
    

    在这里,Subq Select 收集重复的电话号码,SS 子查询然后获取这些记录的最大 ID。最终删除会选择与手机匹配的记录,但ID与MAX ID不匹配

    【讨论】:

    • 使用这段代码我得到这个错误:#1064 - 'TP INNER JOIN ( SELECT MAX(id) id, T.phone FROM TablePhones T INNER JOI' in line 1的语法错误
    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2022-07-19
    • 2019-10-27
    相关资源
    最近更新 更多