2016-08-06 20 views
4

私は複数のRFIDレコードを持つテーブルを持っており、各レコードにはtimeというカラムがあります。Mysqlは1つを除いて重複レコードを削除します

テーブル名がattendance_images(ID、RFID、時間、年、月、日)であると私のクエリは以下の通りです:

DELETE t FROM attendance_images AS t LEFT JOIN (
    SELECT max(t1.time) AS time 
    FROM attendance_images AS t1 
    WHERE t1.year=2016 
    AND t1.month=8 
    AND t1.day=4 
    AND t1.time < 120000 
    GROUP BY t1.RFID 
) keep ON t.time = keep.time 
WHERE keep.time IS NULL 
AND t.year =2016 
AND t.month =8 
AND t.day =4 
AND t.time < 120000 

クエリ効果は(0 rows deleted. (Query took 0.0034 sec))であるが、表には、条件に従って重複レコードを持っています。

enter image description here

この問題を解決するのに役立ちます。

+0

いくつかのデータと一緒にテーブル 'コードを作成'ショーを共有してください。 – 1000111

答えて

3

あなたにもRFIDに一致する必要があります。

DELETE t 
    FROM attendance_images AS t LEFT JOIN 
     (SELECT RFID, max(t1.time) AS time 
      FROM attendance_images AS t1 
      WHERE t1.year = 2016 AND t1.month = 8 AND t1.day = 4 AND t1.time < 120000 
      GROUP BY t1.RFID 
     ) keep 
     ON t.time = keep.time AND t.RFID = keep.RFID 
WHERE keep.time IS NULL AND 
     t.year = 2016 AND t.month = 8 AND t.day = 4 AND t.time < 120000; 

どうやら、複数のRFIDは同じ最大時間を持つことができるので、timeにのみ参加することはできません。

EDIT:

あなたが実際に削除するデータを持っていることを確認する必要があります。

select ai.rfid, max(ai.time), min(ai.time), count(*) 
from attendance_images ai 
where ai.year = 2016 AND ai.month = 8 AND ai.day = 4 AND ai.time < 120000 
group by ai.rfid 
having min(ai.time) < max(ai.time); 

私の推測では、これはあなたがそのような重複を持っていない持っていることを示す、行を戻さないということです。

having句をhaving count(*) > 1に変更して、同じtime値を持つ重複があるかどうかを確認できます。

EDIT II:

クエリの値のインデントはtimeが文字列ではない整数として格納されていることを示唆しています。

t.time < 120000 

:あなたが条件を交換してみてください

t.time + 0 < 120000 
+0

私はクエリを実行しますが、同じ問題がまだあります –

+0

@ GM.Akbar。 。 。それはあなたの状態に合った重複を持っていないことを示唆しています。私が答えに加えたチェックを見てください。 –

+0

ありがとうございます –

関連する問題