SQL硬查询:其他事件之间的事件

时间:2013-11-26 14:15:46

标签: mysql sql

我有以下三个表(简化版):

levelsloaded:

  • id(Int,Primary Key,Auto increment)
  • globalId(Int,Key)
  • 日期(日期时间,密钥)
  • serverId(Int,Key)
  • gamemodeId(Int,Key)
  • mapId(Int,Key)

playerjoins:

  • id(Int,Primary Key,Auto increment)
  • globalId(Int,Key)
  • 日期(日期时间,密钥)
  • serverId(Int,Key)
  • playerId(Int,Key)

playerleaves:

  • id(Int,Primary Key,Auto increment)
  • globalId(Int,Key)
  • 日期(日期时间,密钥)
  • serverId(Int,Key)
  • playerId(Int,Key)

我已经考虑了几个小时关于这个问题,但我似乎无法弄明白。我想要这样:在播放器正在服务器上播放的那一刻,从已加载关卡的levelloaded中选择所有行。

我试图改进“问题”,但这会让人不清楚。

这里的示例图片:

Example

您会看到各种级别加载的事件:

  • 需要16:22:57上的那个,因为它是在我加入服务器之后(以及在我离开服务器之前)发生的。
  • 15:51:2915:37:10上的内容不应该发生,因为我没有在服务器上播放。

我知道这个查询肯定是可能的,但我认为这不是一个简单的查询。

对此有任何帮助将不胜感激。我也非常感谢你自己解决它的建议。

编辑:我设法优化了一点查询。获得解决方案的第一步是:创建一个子查询,获取玩家加入和玩家离开之间的每个级别负载,只有如何获得?请考虑以下事件表:

  • 地图1加载
  • 玩家A加入
  • 地图2加载
  • 地图3加载
  • 玩家A离开
  • map 4 loading
  • 玩家A加入
  • map 5 loading
  • map 6 loading
  • 玩家A离开
  • map 7 loading
  • map 8 loading

然后唯一正确的结果是:地图2,3,5和6。 所以我需要迭代结果集并获得玩家加入和后续玩家之间发生的所有地图,然后跳转到下一行。

1 个答案:

答案 0 :(得分:0)

你没有指定你正在使用的SQL风格的类型,但使用通用SQL我相信接近:

SELECT *
FROM levelsloaded ll, playerjoins pj, playerleaves pl
WHERE ll.serverId = pj.serverId AND ll.serverId = pl.serverId AND 
      pj.playerId = $IDINQUESTION AND pl.playerId = $IDINQUESTION AND
      ll.date >= pj.date AND ll.date < pl.date;

虽然我不记得日期是否包含时间戳。