我有两个表,killlog 和 deathlog,记录了在线游戏中的死亡和击杀信息。我想加入这两个表以产生一个杀戮板。
这可以通过查看记录的杀戮和死亡时间戳并根据每次杀戮的时间加入最接近的死亡来实现。杀死和死亡之间的时间差通常相对接近,但可能相差多达 10 分钟。
我想在时间差方面将 EACH kill 与 CLOSEST death 相匹配,但是我只想将每个 death 与单个 kill 相匹配。
目前我有如下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 |
+--------+---------+------------+------------+---------------------+---------------------+----------+
在这里,您可以看到同一次死亡与两次不同的击杀相匹配。
我的问题是如何确保每次死亡只返回一次,而不是将同一次死亡加入多次杀戮。
最佳答案
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
关于Mysql Join 在时间戳上使用时差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20491707/