删除mysql重复但保留一个

时间:2016-05-21 17:28:20

标签: mysql

我有这个表结构:

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

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

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

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

你可以帮帮我吗? :)

1 个答案:

答案 0 :(得分:0)

您可以通过从重复项中获取最大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

不匹配