我有一个有几千行的表。该表包含两列name
和email
。我有几个重复的行,例如:
删除所有重复结果的最简单方法是什么。例如,表格的内容为SELECT name, DISTINCT(email) FROM table
。
答案 0 :(得分:7)
您可以通过在另一个表中选择该查询,然后重命名以替换原始表格来轻松完成此操作。
CREATE TABLE `table2` (
`name` varchar(255),
`email` varchar(255),
UNIQUE KEY `email` (`email`));
INSERT INTO `table2` SELECT `name`, DISTINCT(`email`) FROM `table`;
RENAME TABLE `table` TO `table1`;
RENAME TABLE `table2` TO `table`;
请注意,此CREATE
应根据您的实际表格格式进行调整。我在电子邮件字段中添加了唯一键,作为关于如何首先防止重复的建议。
或者,你可以循环这个
DELETE FROM `table`
WHERE `email` IN (
SELECT `email` FROM `table` GROUP BY `email` HAVING count(*) > 1
) LIMIT 1
每次调用会删除一条重复记录。限制的重要性在于不删除任何重复的行
答案 1 :(得分:2)
最简单的方法是将所有不同的值复制到新表中:
select distinct *
into NewTable
from MyTable
答案 2 :(得分:1)
DELETE FROM table
WHERE id
NOT IN
(SELECT A.id
FROM
(
SELECT name,MAX(id) AS id
FROM table
GROUP BY name
) A
)
答案 3 :(得分:1)
向表中添加自动增量字段。我相信当你添加它时,它将为你“回填”。由于MySql不允许基于同一个表的子查询进行删除,因此最简单的解决方案是将整个数据集转储到临时表中以供处理。假设您调用了新字段RowId和临时表tempTable,则可以使用如下代码:
DELETE FROM NameAndEmail
LEFT JOIN
( SELECT name, email, Max(RowId) as MaxRowId
FROM temptable
GROUP BY name, email
) as MaxId
WHERE NameAndEmail.Email = MaxId.Email
and NameAndEmail.Name = MaxId.Name
and NameAndEmail.RowId <> MaxId.RowId
答案 4 :(得分:1)
使用重复数据清理表的最简单方法是只添加唯一索引:
set session old_alter_table=1;
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX (name, email);
要特别注意第一个sql语句,不带它the IGNORE flag is ignored,并且alter table语句将失败并显示错误。