2011-02-10 125 views
4

這裏是一個難點, 如何刪除除最後一行(例如3行)以外的其他字段中的每個唯一值?SQL爲每個唯一值刪除除最後N行之外的所有行

這裏有一個視覺的問題:

id | otherfield 
--------------- 
1 | apple  <- DELETE 
2 | banana  <- KEEP 
3 | apple  <- DELETE 
4 | apple  <- KEEP 
5 | carrot  <- KEEP 
6 | apple  <- KEEP 
7 | apple  <- KEEP 
8 | banana  <- KEEP 

我怎麼會在SQL做到這一點?

+0

找到東西接近,但不立足於在其他字段中的每個獨特的值:http://stackoverflow.com/questions/4720996/delete-n-number-of-old-records-from-table-in-mysql – user546911 2011-02-10 04:35:31

+0

聽起來像WINDOW擴展被設計來解決的東西但我不知道en ough關於它或在MySQL中的支持來回答你的問題。 – SpliFF 2011-02-10 04:37:57

+0

表中有多少條記錄? – 2011-02-10 04:40:18

回答

1

非測試,但這些方針的東西可能的工作:

DELETE t.* 
FROM table t JOIN (
    SELECT id 
     @rowNum := IF(@otherfield <> otherfield, 1, @rowNum + 1) rn, 
     @otherfield := otherfield otherfield 
    FROM (
     SELECT id, otherfield 
     FROM table 
     ORDER BY otherfield, id DESC 
    ) t, (SELECT @otherfield := NULL, @rowNum := -1) dm 
) rs ON t.id = rs.id 
WHERE rs.rn > 3 
1
Delete MyTable 
Where Id In (
      Select Id 
      From (
        Select Id 
         , (Select COUNT(*) 
          From MyTable As T2 
          Where T2.OtherField = T.OtherField 
           And T2.Id > T.Id) As Rnk 
        From MyTable As T 
        ) As Z 
      Where Z.Rnk > 2  
      ) 

另一個版本,這可能是有點快:

Delete MyTable 
Where Id In (
      Select T.Id 
      From MyTable As T 
       Left Join MyTable As T2 
        On T2.OtherField = T.OtherField 
         And T2.Id > T.Id 
      Group By T.Id 
      Having Count(T2.Id) > 2 
      ) 
相關問題