This question already has answers here:
Delete all Duplicate Rows except for One in MySQL? [duplicate]
                                
                                    (2个答案)
                                
                        
                                3年前关闭。
            
                    
我有这个表结构:

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


我知道,我可以使用此sql显示重复的行:

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


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

你能帮我吗? :)

最佳答案

为此,您可以从重复项中获取最大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不匹配

10-07 12:31
查看更多