2011-11-23 124 views
2

假设该表:MySQL的删除重复的连续行

ID ColA ColB 
1 7 8 
2 7 9 
3 7 9 
4 5 8 
5 6 9 
6 6 9 
7 5 4 

的PK是ID coumn。 现在,我想删除连续行中的所有重复项ColAColB

在此示例中,第2,3和5,6行包含重复项。 这些将被删除,以便保留更高的ID。

输出应该是:

ID ColA ColB 
1 7 8 

3 7 9 
4 5 8 

6 6 9 
7 5 4 

这怎么能与MySQL做什么?

感谢, 克林斯曼

+0

对不起,但你有没有尝试过,或者至少有点想过? –

回答

1
select ID from MyTable m1 where 0 < (select count(*) from MyTable m2 where m2.ID = m1.ID - 1 and m2.ColA = m1.ColA and m2.ColB = m1.ColB) 

,然后你可以使用一个

delete from MyTable where ID in ... 

查询。这样它肯定能在任何版本中工作。

+0

工程就像一个魅力,优秀! – Juergen

+0

我很高兴我能帮上忙。 –

+0

还有一个问题:我用SELECT试过了你的第一条语句,但是在编写DELETE MyTable m1时...由于某种原因(错误的SQL语法)解析器抱怨m1。 – Juergen

-1

取决于你有多少条记录有,这可能不是最有效的:

SELECT (SELECT TOP 1 id FROM table WHERE colA = m.colA AND colB = m.colB ORDER BY id DESC) AS id, m.* 
FROM (SELECT DISTINCT colA, colB 
     FROM table) m 

,因为我通常使用MSSQL可能有语法错误,但这个想法应该是相似的。

+0

MySQL中没有top关键字,而是使用Limit。另外,您不要删除重复项目。此外,您的选择甚至不会选择问题中定义的重复项(连续的ID,除序列中的第一个外)。我很抱歉,但我不得不让你失望。 –

+0

哎呀,我错过了删除部分。误读它,是的,我应该使用LIMIT而不是TOP;这是我的MS东西踢英寸但如果你删除tabe WHERE NOT IN(上面的查询),你会留下不在嵌套选择的ID,并且嵌套选择选择第一个最高的ID,因为我命令通过,我们只选择第一个。只要删除m。*。 – JohnathanKong

0

我称之为第一个'测试'表。

首先创建一个表,将举行可乐COLB的所有相同的组合:

create temporary table tmpTable (ColA int, ColB int); 
insert into tmpTable select ColA,ColB from test group by ColA, ColB; 

现在,选择在原表中最大的ID为可乐COLB的每个相同的组合。要把它放到一个新的表(称为idsToKeep因为这些行,我们不希望删除):

create temporary table idsToKeep (ID int); 
insert into idsToKeep select (select max(ID) from test where test.ColA=tmpTable.ColA and test.ColB=tmpTable.ColB) from tmpTable; 

最后,删除所有数据从原始表不在idsToKeep表中的条目:

delete from test where ID <> all (select ID from idsToKeep); 
+0

此方法保证具有最高ID的行不会被删除。 – drmatt

+0

如果行不是连续的,但是相同的ColA和ColB在序列中返回,则这将不起作用。 – jsgoupil

2
CREATE TEMPORARY TABLE duplicates (id int primary key) 

INSERT INTO duplicates (id) 
    SELECT t1.id 
     FROM table t1 
     join table t2 on t2.id = t1.id + 1 
    WHERE t1.ColA = t2.ColA 
     and t1.ColB = t2.ColB 

-- SELECT * FROM duplicates --> are you happy with that? => delete 
DELETE table 
    FROM table 
    join duplicates on table.id = duplicates.id