2013-12-10 71 views
1

我有两张表,killlog和deathlog记录来自在线游戏的死亡和杀死信息。我想加入这两张桌子来制作一个杀人板。Mysql在时间戳上使用时间差异

这是可能的,通过查看时间戳杀死和死亡记录并加入每个杀死时间最接近的死亡。杀人和死亡之间的时间差异通常比较接近,但可以长达10分钟。

我想在时间差异方面将每次杀死与CLOSEST死亡进行匹配,但是我只想将每次死亡与单次杀死相匹配。

目前,我有以下SQL语句

SELECT 
distinct killlog.ID, deathlog.id, killlog.PlayerName, deathlog.PlayerName, killlog.Timestamp as killtime, deathlog.Timestamp as deathtime, 
TIMEDIFF(killlog.Timestamp, deathlog.Timestamp) 
FROM killlog 
inner JOIN deathlog on 
TIMEDIFF(killlog.Timestamp, deathlog.Timestamp) <= 600 
GROUP by 
killlog.id 

这几乎是给了我所需要的输出,但是在某些情况下,我看到了死亡匹配多个杀死。例如:

+--------+---------+------------+------------+---------------------+---------------------+----------+ 
| killID | DeathID | KillerName | VictimName | killTime   | deathTime   | timeDiff | 
+--------+---------+------------+------------+---------------------+---------------------+----------+ 
|  8 |  28 | DKmintz | Hanfkeks | 09/12/2013 21:30:23 | 09/12/2013 21:30:09 | 00:00:14 | 
+--------+---------+------------+------------+---------------------+---------------------+----------+ 
|  9 |  28 | Sam Fisher | Hanfkeks | 09/12/2013 21:31:03 | 09/12/2013 21:30:09 | 00:00:54 | 
+--------+---------+------------+------------+---------------------+---------------------+----------+ 

在这里你可以看到与两种不同的杀死相匹配的死亡。

我的问题是如何确保我只返回一次死亡,并且没有加入多次死亡。

回答

0
TIMEDIFF(killlog.Timestamp, deathlog.Timestamp) <= 600 
GROUP by 

Here insted of groub by use partiotion by(kill time)<=600 and you will 
8 28 DKmintz Hanfkeks 09/12/2013 21:30:23 09/12/2013 21:30:09 00:00:14 record 
+0

'SELECT 不同killlog.ID,deathlog.id,killlog.PlayerName,deathlog.PlayerName,killlog.Timestamp作为消磨时间,如deathlog.Timestamp deathtime, TIMEDIFF(killlog.Timestamp,deathlog.Timestamp) FROM killlog INNER JOIN deathlog上 TIMEDIFF(killlog.Timestamp,deathlog.Timestamp)<= 600 通过 TIMEDIFF分区(killlog.Timestamp,deathlog.Timestamp)<= 600' 这导致SQL错误,我找不到有关“分区依据”的很多信息,以供MySQL查看问题在于。 – user2976138