0

可能重复:
如何删除 MySQL 表中的重复项

我将纯文本文件中的数据导入 mysql 数据库。现在我发现我有重复的条目,我想删除它们。重复项由不是主键的键标识。请提醒我必须保留其中一件重复的物品。

表 T1 具有三个重复项,例如:

ID(唯一,主键) REAL_ID(char(11))

1 '01234567890'
2 '01234567891'
3 '01234567891'
4 '01234567891'
...

现在,我用

 SELECT ID AS x, COUNT(*) AS y FROM T1 GROUP BY x HAVING y>1;

来识别重复项。结果我

+--------+-------------+
| 身份证 | REAL_ID |
+--------+-------------+
| 1 | 01234567891 |
| 2 | 01234567891 |
| 3 | 01234567891 |
+--------+-------------+

我什至可以构建我必须删除的 Id 列表:

SELECT ID 
FROM T1 
  RIGHT JOIN ( (SELECT ID AS x, COUNT(*) AS y 
                FROM T1 
                GROUP BY x 
                HAVING y>1) AS T2 ) ON (T2.x=T1.REAL_ID) LIMIT 1,100;

结果是

+--------+-------------+
| 身份证 | REAL_ID |
+--------+-------------+
| 2 | 01234567890 |
| 3 | 01234567890 |
+--------+-------------+

现在,我需要有关如何删除这些条目的帮助。

由于不可能将 DELETE 与子查询结合使用,我试图标记列 REAL_ID 中的所有重复条目,然后使用

DELETE FROM T1 WHERE REAL_ID='flag';

但我不知道如何标记这些条目。

4

1 回答 1

0

你可以这样做:

DELETE t
FROM T1 t 
RIGHT JOIN 
( 
   SELECT ID, COUNT(*) AS y 
   FROM T1 
   GROUP BY ID
   HAVING y > 1 
) AS T2 ON T2.ID = t.REAL_ID;

更新:请注意,您不能使用LIMIORDER BY从多个表中删除时,引用自DELETE

对于多表语法,DELETE 从每个 tbl_name 中删除满足条件的行。在这种情况下,不能使用 ORDER BY 和 LIMIT

试试这个:

DELETE t
FROM T1 t 
WHERE REAL_ID IN
( 
  SELECT t1.REAL_ID
  FROM T1 t1
  RIGHT JOIN 
  ( 
     SELECT ID, COUNT(*) AS y 
     FROM T1 
     GROUP BY ID
     HAVING y > 1 
  ) AS T2 ON T2.ID = t.REAL_ID
  WHERE t1.REAL_ID IS NOT NULL
  ORDER BY t2.y DESC
  LIMIT 1, 1000
)
于 2012-12-12T13:28:05.680 回答