Mysql 如何删除重复行,但基于两列保留1

Mysql 如何删除重复行,但基于两列保留1,mysql,sql,Mysql,Sql,我有一个叫调度程序的表。它包含以下列: ID sequence_id schedule_time (timestamp) processed source_order 我需要从表中删除重复的行,但保留一行,该行对于mysql的特定序列具有相同的计划时间和源顺序,其中processed=0 DELETE a from tbl a , tbl b WHERE a.Id>b.Id and a.sequence_id= b.sequence_id and a.processed=0; 对于m

我有一个叫调度程序的表。它包含以下列:

ID
sequence_id
schedule_time (timestamp)
processed
source_order
我需要从表中删除重复的行,但保留一行,该行对于mysql的特定序列具有相同的计划时间和源顺序,其中processed=0

DELETE a from  tbl a , tbl b WHERE a.Id>b.Id and
a.sequence_id= b.sequence_id and a.processed=0;
对于mysql

DELETE a from  tbl a , tbl b WHERE a.Id>b.Id and
a.sequence_id= b.sequence_id and a.processed=0;
我申请这个职位;P 你看到了吗

-固定版本-

DELETE yourTable FROM yourTable LEFT OUTER JOIN (
SELECT MIN(ID) AS minID FROM yourTable WHERE processed = 0 GROUP BY schedule_time, source_order
) AS keepRowTable ON yourTable.ID = keepRowTable.minID
WHERE keepRowTable.minID IS NULL AND processed = 0
我申请这个职位;P 你看到了吗

-固定版本-

DELETE yourTable FROM yourTable LEFT OUTER JOIN (
SELECT MIN(ID) AS minID FROM yourTable WHERE processed = 0 GROUP BY schedule_time, source_order
) AS keepRowTable ON yourTable.ID = keepRowTable.minID
WHERE keepRowTable.minID IS NULL AND processed = 0

删除重复项的最快方法-肯定是通过添加索引将其强制删除,在表中只保留一个副本:

ALTER IGNORE TABLE dates ADD PRIMARY KEY (

  ID
  sequence_id
  schedule_time
  processed
  source_order
)
现在,如果您有一个键,您可能需要删除它,以此类推,但问题是,当您将带有IGNORE的唯一键添加到具有重复项的表中时,任务是删除所有额外的记录/重复项。因此,添加此密钥后,您现在只需再次删除它即可创建新的副本:-

现在,如果您需要对其中一个重复项进行更复杂的筛选,以确保您不能仅将其包含在索引中—虽然不太可能,但您可以在选择并输入所需内容的同时创建一个表—所有这些都在同一个查询中:

CREATE TABLE tmp SELECT ..fields..  GROUP BY ( ..what you need..)

DROP TABLE original_table

ALTER TABLE tmp RENAME TO original_table_name

删除重复项的最快方法-肯定是通过添加索引将其强制删除,在表中只保留一个副本:

ALTER IGNORE TABLE dates ADD PRIMARY KEY (

  ID
  sequence_id
  schedule_time
  processed
  source_order
)
现在,如果您有一个键,您可能需要删除它,以此类推,但问题是,当您将带有IGNORE的唯一键添加到具有重复项的表中时,任务是删除所有额外的记录/重复项。因此,添加此密钥后,您现在只需再次删除它即可创建新的副本:-

现在,如果您需要对其中一个重复项进行更复杂的筛选,以确保您不能仅将其包含在索引中—虽然不太可能,但您可以在选择并输入所需内容的同时创建一个表—所有这些都在同一个查询中:

CREATE TABLE tmp SELECT ..fields..  GROUP BY ( ..what you need..)

DROP TABLE original_table

ALTER TABLE tmp RENAME TO original_table_name

您能给出示例记录吗?一个非常简单的解决方案是从ID不在不同记录的select ID中的表中删除,您能给出示例记录吗?一个非常简单的解决方案是从ID不在不同记录的select ID中的表中删除,查询需要花费大量时间执行。我有3000个问题,执行起来太长了。查询执行起来要花很多时间。我有3000个rowsTry,这执行起来太长了。谢谢,但是keepRowTable.minID而不是keepRowTable.id有一个小小的错误。谢谢你的更正。对不起,我弄错了。我已经按照你的建议修复了它。谢谢,但是有一个小小的错误keepRowTable.minID而不是keepRowTable.id谢谢你的更正。对不起,我弄错了。我已经按照你的建议把它修好了。