2016-03-03 136 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'放在了' –