2016-03-03 143 views
0

我有一臺服務器在每次訪問時向數據庫添加多條記錄。服務器在每次訪問的2-5個記錄之間完成了它。所有的數據都是相同的期望時間戳。我想每次訪問只保留1條記錄。並刪除其他記錄。在mysql中刪除時間戳間隔小於5秒的重複行

之前:

+----+----------------------+------+--------+ 
| id |  timestamp  | user | action | 
+----+----------------------+------+--------+ 
| 1 | 01-01-01-16 03:02:05 | 5 | visit | 
| 2 | 01-01-01-16 03:02:06 | 5 | visit | 
| 3 | 01-01-01-16 03:02:05 | 6 | watch | 
| 4 | 01-01-01-16 03:02:06 | 6 | watch | 
| 5 | 01-01-01-16 03:04:05 | 9 | visit | 
| 6 | 01-01-01-16 03:04:06 | 9 | visit | 
| 7 | 01-01-01-16 03:04:07 | 9 | visit | 
| 8 | 01-01-01-16 03:04:35 | 2 | see | 
+----+----------------------+------+--------+ 

預期結果:

+----+----------------------+------+--------+ 
| id |  timestamp  | user | action | 
+----+----------------------+------+--------+ 
| 1, | 01-01-01-16 03:02:05 | 5 | visit | 
| 3, | 01-01-01-16 03:02:05 | 6 | watch | 
| 4, | 01-01-01-16 03:02:06 | 6 | watch | 
| 5, | 01-01-01-16 03:04:05 | 9 | visit | 
| 8, | 01-01-01-16 03:04:35 | 2 | see | 
+----+----------------------+------+--------+ 

換句話說:正如所看到的,線1,2是相同的。同一個用戶,並且只有一秒之間。所以我刪除線2.4,我不碰線,因爲它不是一個訪問

我有查詢的開頭:delete from table where id in(...)

+1

查看http://sensefulsolutions.com/2010/10/format-text-as-table.html創建更好的表 –

+1

那麼訪問多少時間是考慮同一條記錄? –

+0

最多5秒 – Aminadav

回答

1

使用join執行查詢更快

DELETE t1 FROM visit t1 
INNER JOIN visit t2 ON v1.user = v2.user 
WHERE v1.id < v2.id AND 
TIMESTAMPDIFF(SECOND, t1.timestamp, t2.timestamp) < 5 AND 
t1.action = 'visit' AND 
t2.action = 'visit' 
+0

你確定,這個語法在mysql中有效嗎?從...刪除t1?在連接中刪除是什麼意思? – Aminadav

+0

是的,當你在'delete'查詢中創建'join'時,你想要從哪個表中定義你想要刪除的數據。 –

+0

謝謝。真的有幫助。 – Aminadav

1
DELETE FROM visit 
     WHERE id IN (
       SELECT v2.id 
       FROM visit v1   
       JOIN visit v2 
       ON v1.id < v2.id 
       AND v1.user = v2.user      
       AND TIMESTAMPDIFF(SECOND, v1.timestamp, v2.timestamp) < 5 
       WHERE v1.action = 'visit'   
       AND v2.action = 'visit'        
       ) 
+0

爲什麼你在'where'部分添加'where v1.action ='visit''而不是'on'部分? – Aminadav

+0

我通常把'field =常量'放在...上'我把'field1 = field2'放在了' –