2011-02-10 8 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

+0

WINDOW拡張機能が解決するように設計されたもののようなサウンド私はenを知らないあなたの質問に答えるためにmysqlでそれをサポートしていますか? – SpliFF

+0

テーブルにはいくつのレコードがありますか? –

答えて

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

#1064 - SQL構文に誤りがあります。あなたのMySQLサーバーのバージョンに対応するマニュアルをチェックして、右側の構文を使用してテーブル履歴JOIN(SELECT id @rowNum:= IF(@page <>ページ、1、@ro、行2の DELETE履歴)を使用してください。 *表履歴からJOIN( SELECT IDの@たrowNum:= IF(@page <> PAGE、1、@rowNum +1)RN、@page:= PAGEページ SELECT ID (FROM、FROM PAGE表 PAGE BY ORDER、識別DESC )履歴、( SELECT @page:= NULL、@rowNum:= -1 )DM )history.id = rs.idのRSWHERE rs.rn> 3 – user546911

+0

@ user546911テーブル名を 'table'に置き換えてください。クエリに 'table'という単語を残してはいけません。第二版取る –

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

: #1054 - '句に' 不明な列 'T2.page' を はT LEFT AS履歴から( SELECT T.id 内のIDがT2 ON T2として歴史を登録しよ履歴から削除します.PAGE = T.page とT2.id> T.id GROUP BY T.id COUNT(T2.id)を有する> 2 ) – user546911

+0

user646911 @ - どこ私のクエリでT2.page'はそう、参照 'ではありません私はあなたがそのエラーをどうやって得たのか分かりません。 – Thomas

+0

@ user646911 - このエラーは、 'history'テーブルに' page'カラムが見つからないことを意味します。あなたはそれがスペルであり、おそらく正しく資本化されていると確信していますか? – Thomas

関連する問題