【发布时间】:2015-05-23 01:52:05
【问题描述】:
所以我的数据库中有两个表,它们看起来都像这样:
通讯:(拨打电话)
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 他们拨打了电话。因此,这将找到一个呼叫者的可能位置。
在这种情况下,789 拨打了07:02:12 的电话,07:02:16 上有他的移动数据,表明他的位置在(39,52)。所以这将显示为他的可能位置,因为它仅在 4 秒后出现。
但是,我如何为通信表中的每个呼叫运行特定查询,而不必手动填写每个呼叫?
例如,不是只为 1 个呼叫计算位置,而是为通信表的所有行计算位置,例如:
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 的,我真的无法理解。任何帮助将不胜感激,谢谢!
【问题讨论】:
-
你愿意用 PHP 编写脚本吗?有人可能会给你一个纯粹的 mySQL 解决方案,但我通常会为此编写一个快速脚本。
-
您能否根据您发布的示例数据提供所需的结果(附说明)。您可能还需要更新示例数据。
-
@steveklein:同样,不需要任何脚本语言。子选择和加入就可以了。我对 MySQL 语法不够熟悉,无法编写答案,但可以使用 SQL Server 轻松完成,而且我确信 MySQL 解决方案也是可能的。根本不需要在其中引入另一种语言,也不需要任何形式的循环。
-
是的。您可以在
movement.IDNumber和communication.FromIDNumber上使用 INNER JOIN,并在时间戳上使用子选择来查找最接近的匹配项。正如我所说,我对 MySQL 语法(尤其是与日期/时间功能相关的)不够熟悉,无法编写答案。 -
已发布。请试一试。
标签: mysql sql phpmyadmin