【问题标题】:How to run a specific sql query for every row in the table?如何对表中的每一行运行特定的 sql 查询?
【发布时间】: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

我将IDNumbertimestamp 设置为调用者的FromIDNumbertimestamp 他们拨打了电话。因此,这将找到一个呼叫者的可能位置。

在这种情况下,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.IDNumbercommunication.FromIDNumber 上使用 INNER JOIN,并在时间戳上使用子选择来查找最接近的匹配项。正如我所说,我对 MySQL 语法(尤其是与日期/时间功能相关的)不够熟悉,无法编写答案。
  • 已发布。请试一试。

标签: mysql sql phpmyadmin


【解决方案1】:

试试这个:

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)

您可以使用this SQL Fiddle 来测试不同的数据组合。

【讨论】:

  • 不幸的是,服务器查询需要很长时间,所以我无法在实际数据集上检查这个解决方案,但我在 SQL Fiddle 上玩了一下,它似乎工作得很好,非常感谢!!
  • 两个表中的 ID 和时间戳都有索引吗?
  • 我不这么认为,为什么?
  • 我刚刚查了一下,谢谢,我不知道索引,但我认为这会有很大帮助.... 看到服务器查询仍在进行中。我去看看!
  • 还要检查EXPLAIN 以确保服务器确实使用了您的新索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
相关资源
最近更新 更多