2013-02-08 55 views
1

我有表称为调度程序。它包含以下几列:如何删除重复行但保留1基于两列

ID 
sequence_id 
schedule_time (timestamp) 
processed 
source_order 

我需要从表中删除重复的行,但保持1列,其中加工= 0

+0

您能给出样本记录吗? –

+0

一个非常简单的解决方案是 '从表中删除ID不在(选择不同记录的ID)' – Techmonk

回答

1
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.ID IS NULL AND processed = 0 

我申请此职位; P How can I remove duplicate rows? 你见过吗?

--fixed version--

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 
+0

谢谢,但稍有错误keepRowTable.minID,而不是keepRowTable.ID –

+0

感谢您的更正。对不起,我错了。我已经修复它作为你的建议。 – ittgung

0

对于MySQL具有特定sequence_id相同schedule_time和source_order

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

查询需要很多时间来执行。我有3000行 –

+0

尝试这个http://stackoverflow.com/questions/3311903/remove-duplicate-rows-in-mysql – Meherzad

+0

其执行时间太长。 –

0

删除重复的最快方法 - 绝对是通过添加索引,迫使他们出来,只留下一个各留在表的副本:

ALTER IGNORE TABLE dates ADD PRIMARY KEY (

    ID 
    sequence_id 
    schedule_time 
    processed 
    source_order 
) 

现在,如果你有一个密钥,你可能需要删除它等等,但问题是,当你添加一个带有IGNORE的唯一密钥到一个带有重复项的表中时 - bahavior是删除所有额外的记录/重复项。因此,在您添加此密钥后,您现在只需要再次将其删除即可创建新的重复项目:-)

现在,如果您需要执行更复杂的过滤(对女巫之一进行复制以保持您可以不只是包含在索引中 - 尽管不太可能),您可以在您选择并输入所需内容的同时创建一个表格 - 全部在同一个查询中:

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

DROP TABLE original_table 

ALTER TABLE tmp RENAME TO original_table_name