This question already has answers here:
Delete all Duplicate Rows except for One in MySQL? [duplicate]
(2个答案)
3年前关闭。
我有这个表结构:
我知道,我可以使用此sql显示重复的行:
但我需要一个sql命令,该命令删除所有重复项,但保留具有最高ID的行。
你能帮我吗? :)
在这里,Subq Select收集重复的电话号码,然后SS子查询获得这些记录的最大ID。最终删除将选择与手机匹配的记录,但ID与MAX ID不匹配
(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不匹配