2017-07-16 17 views
1

日付の列に応じて行を削除しようとしていますが、指定した日付の間にある行を削除したいので、常に最も古い行と最新のものを保持したい中央の行が削除されます。私は現在、このコードを使用していますMySQL |中間の日付範囲から行を削除する

...

DELETE t FROM tracking t INNER JOIN users u ON u.id = t.uid WHERE u.name = :name 

この早い行である単一の行を削除します。どういうわけか、私は2行の真ん中の行を削除し、別々の行にある日付も削除する必要があります。

enter image description here

画像は、現在のテーブルがレイアウトされる方法を示しています。強調表示された行は、削除したい行です。

DELETE t 
    FROM tracking t INNER JOIN 
     users u 
     ON u.id = t.uid INNER JOIN 
     (SELECT t.uid, MIN(tracked_date) as mintd, MAX(tracked_date) as maxtd 
      FROM tracking t 
      GROUP BY t.uid 
     ) tt 
     ON t.uid = tt.uid 
    WHERE u.name = :name AND 
      t.tracked_date NOT IN (tt.mintd, tt.maxtd); 

次のバージョンは、おそらくより良いパフォーマンスがあります:

DELETE t 
    FROM tracking t INNER JOIN 
     users u 
     ON u.id = t.uid INNER JOIN 
     (SELECT t.uid, MIN(tracked_date) as mintd, MAX(tracked_date) as maxtd 
      FROM tracking t INNER JOIN 
       users u 
       ON u.id = t.uid 
      WHERE u.name = :name 
      GROUP BY t.uid 
     ) tt 
     ON t.uid = tt.uid 
    WHERE u.name = :name AND 
      t.tracked_date NOT IN (tt.mintd, tt.maxtd); 

を追加のサブクエリに参加するので、それはより複雑に見えます。ここ

答えて

2

は一つの方法です。しかし、サブクエリを集約する前にフィルタリングすることができます。

+0

これは機能しますが、まだ2つではなく3つの行で終わりますか? – tallent123

+0

これは私のせいで、delete文の後に挿入されました!これは魅力的な、ありがとう!] – tallent123

関連する問題