2014-08-27 24 views
0

我有一個表news 48列從列重複的表中刪除最舊的行?

表有像這樣的一些值:

ID|title   |date  |....... 
1|Apple iphone 6 |2014-08-23 
2|Samsung Galaxy s5|2014-08-23 
3|LG G3   |2014-08-25 
4|Apple iphone 6 |2014-08-25 
5|HTC One m8  |2014-08-27 

「標題」 值是ID 14Apple iphone 6

我想複製在新聞表中保留最後一個ID行並刪除其他舊行。 所以在上面的例子中,我想刪除ID爲1的行,保留具有相同標題列值的最後一個id(4)。

+0

您確定需要刪除它嗎? – Strawberry 2014-08-27 12:34:49

回答

3
delete from news 
where id not in 
(
    select * from 
    (
    select max(id) 
    from news 
    group by title 
) tmp 
) 

該查詢按標題分組,併爲每個唯一標題選擇最新的id。然後它刪除所有沒有那個id的記錄。

我添加了另一個子查詢,因爲在MySQL中,您不能從要同時刪除的表中進行選擇。

0

在MySQL中,我會使用join做到這一點:

delete n 
    from news n join 
     (select title, max(id) as keepid 
     from news 
     group by title 
     ) ti 
     on ti.title = n.title and ti.id < keepid; 

MySQL是在大約參照表被修改deleteupdate聲明挑剔。不幸的是,要做到這一點的ANSI SQL(和其他的數據庫)的典型方式完全不是那麼回事:

delete from news 
    where id < (select max(id) from news n2 where n2.title = n.title); 

可以解決這個問題有一個MySQL破解使用子查詢的一個額外層。

0

這是做的最明確方式:

DELETE n FROM news n INNER JOIN news nn ON n.title = nn.title AND n.id < nn.id; 

http://sqlfiddle.com/#!2/02255f/2

+0

我運行這個查詢,但它仍然運行約10分鐘,沒有完成,我殺了查詢。我在新聞表中有大約250K條記錄,所以查詢速度非常慢?對我來說沒有用 – Ozy 2014-08-27 14:55:55

+0

@juergen的答案怎麼樣? – Bulat 2014-08-27 14:57:32

+0

@juergen的查詢刪除了所有重複的行。最舊的和最新的ID也是如此。 – Ozy 2014-08-31 10:31:07

0

棘手,因爲它很容易除去非重複

1找到重複 2確定最古老的ID 3只刪除那些!

delete from news where id in (
    select min(id) from news 
    group by title 
    having title in (
     select title from news group by title having count(title) > 1 
    ) 
)