如何按日期和 ID 删除 MySQL 表上的重复项? [复制]

Posted

技术标签:

【中文标题】如何按日期和 ID 删除 MySQL 表上的重复项? [复制]【英文标题】:How to delete duplicates on a MySQL table by date and id? [duplicate] 【发布时间】:2016-04-05 12:04:11 【问题描述】:

我有一个表格,其中包含来自应用的结果。 有些结果是重复的,我可以看到哪个“survey_question_id”有重复的答案。

通过这个查询,我可以看到每个“survey_question_id”有多少个重复项:

    SELECT `id`,`survey_question_id`,
   `question`,`date`, COUNT(*) 
   FROM answers 
   GROUP BY `survey_question_id`, `date` 
   HAVING COUNT(*) > 1 and `date` > '2015-10-15'

表格结果:

如何删除重复项?

【问题讨论】:

您想删除所有这些答案,还是只想为每个问题保留一个重复的答案? @TareqMahmood 我只想为每个问题保留一个重复的答案。 @JayBlanchard 它不一样,因为要重复它必须具有相同的survey_question_id、问题和日期。 不,不是真的。从 mysql 中删除重复项是一个通用概念,通常与列名和/或数据无关。 如果您的字段只有日期(不包括时间),您可能可以使用该解决方案 【参考方案1】:

对于重复记录删除,您可以使用:

如果您想保留 LOWEST id,则可以使用:

DELETE n1 FROM answers n1, answers n2 WHERE n1.id > n2.id 
AND n1.id <> n2.id
AND n1.survey_question_id = n2.survey_question_id 
AND n1.question = n2.question 
AND n1.date = n2.date

如果您想保留 HIGEST id,则可以使用:

DELETE n1 FROM answers n1, answers n2 WHERE n1.id < n2.id 
AND n1.id <> n2.id
AND n1.survey_question_id = n2.survey_question_id 
AND n1.question = n2.question 
AND n1.date = n2.date

如果您认为将来会再次发生这种情况,请添加 UNIQUE INDEX

ALTER IGNORE TABLE answers   
ADD UNIQUE INDEX (id,survey_question_id,
   question,date);

附注:在执行任何类型的批量删除之前,请确保您拥有此表的副本

【讨论】:

我试过了,但给出了结果:MySQL返回了一个空的结果集(即零行)。 @pmcmf 你在这个表4中有多少列? @pmcmf:我已经更新了我的答案 你的和这个类似:DELETE a1 FROM answers a1, answers a2 WHERE a1.id> a2.id AND a1.survey_question_id = a2.survey_question_id AND a1.question = a2.question AND a1。日期 = a2.date AND a1.date > '2015-10-15' 无@pmcmf > 【参考方案2】:

试试这个:

DELETE FROM answers
WHERE date > '2015-10-15'
AND id NOT IN 
  (SELECT id
      FROM (SELECT MIN(id) AS id  FROM answers
            WHERE date > '2015-10-15'
            GROUP BY survey_question_id) x
  )

【讨论】:

这是非常危险的查询 这将删除一堆好的数据,同时在系统中留下重复的数据。根据屏幕截图中的数据,ID 141450 的 2 个副本将保持不变,而所有其他数据(在屏幕截图中)将被销毁。 对不起,这个不起作用。还是谢谢【参考方案3】:

你可以

    create table your_table2 as select distinct * from original_table 然后只是 删除带有一些级联约束的 original_table 并 更改 your_table2,重命名并重新添加所有约束 删除 original_table 中的所有数据,然后插入 original_table select * from your_table2

我认为this和你的问题类似。

【讨论】:

在 tmp 表 ist 中保存数据的好方法

以上是关于如何按日期和 ID 删除 MySQL 表上的重复项? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

删除左表上的重复项,同时在右表SELECT JOIN上保留重复项

如何在按唯一日期时间排序时删除重复项

删除连接表的重复记录并修复相关表上的外键

根据多列和日期时间删除重复项

如何在 Laravel 中的其他 2 个连接表上按日期列排序表?

Oracle SQL 按日期查找唯一 ID