所以我的数据库中有两个表,它们都看起来像这样:
通讯:(已拨打电话)
Timestamp FromIDNumber ToIDNumber GeneralLocation 2012-03-02 09:02:30 878 674 Grasslands 2012-03-02 11:30:01 456 213 Tundra 2012-03-02 07:02:12 789 654 Mountains
移动:
Timestamp IDNumber Type X Y 2012-03-02 11:02:30 379 pedestrian 32 46 2012-03-01 12:32:41 654 pedestrian 54 56 2012-03-02 07:02:16 789 pedestrian 39 52
我想做的是找到最接近给定“通信”时间戳的“移动”时间戳。基本上,我想找到一个人打电话时可能去过的地方。
目前,我这样做是:
SELECT movement.timestamp, movement.x, movement.y FROM movement WHERE (movement.IDNumber=789 AND movement.timestamp>='2012-03-02 07:02:12') ORDER BY movement.timestamp LIMIT 1;
输出将是:
timestamp x y 2012-03-02 07:02:12 39 52
我将呼叫者的IDNumber和设置timestamp到的FromIDNumber位置,然后timestamp他们拨打了电话。因此,这将找到一个呼叫者的可能位置。
IDNumber
timestamp
FromIDNumber
在这种情况下,789打电话到07:02:12,并且他的移动数据07:02:16表明他的位置在(39,52)。这样一来,它就会显示在他可能的位置,因为只有4秒钟之后。
789
07:02:12
07:02:16
(39,52)
但是,如何对Communication表中的每个呼叫运行该特定查询,而不必手动填写每个查询?
例如,然后,将为通信表的所有行计算位置,而不是仅针对一次呼叫进行计算,例如:
timestamp x y 2012-03-02 07:02:12 39 52 2012-03-02 03:15:14 23 34 2012-03-02 05:06:07 34 55 2012-03-02 02:41:21 12 56 ...
等等。
我尝试将某些东西与java.sql一起使用,但是事情变得有些复杂,我想知道是否有更简单的方法。我该如何解决这个问题?
问题是我刚刚开始学习SQL,所以我真的不确定在这里做什么。我看了一些其他的SO帖子,但它们全都用于sql- server,而我却真的听不懂。任何帮助将不胜感激,谢谢!
试试这个:
SELECT c.FromIDNumber, m.Timestamp, m.X, m.Y FROM Communication c JOIN Movement m ON c.FromIDNumber = m.IDNumber WHERE m.TimeStamp = (SELECT MIN(mm.Timestamp) FROM Movement mm WHERE mm.TimeStamp >= c.TimeStamp)
您可以使用此 SQL Fiddle 来测试不同的数据组合。