MySQL - 需要根据子表中的日期/时间列获取父表中每条记录的最新数据

标签 mysql

我们有两个表 Spot 和 Spot_Log,其中包含以下数据:

现货:

ESN       | Department | VehicleModel   | AssignedToName
--------------------------------------------------------
0-2506698 | 23         | 2014 Equinox   | Ron
0-2507419 | 32         | 2015 Sierra    | Chuck
0-2506208 | 32         | 2015 Sierra    | Don
0-2506629 | 32         | 2014 Silverado | Jonathan

Spot_Log:

ESN_ID    | est_dt           | latitude  | longitude 
-----------------------------------------------------
0-2506698 | 20/11/2014 11:08 | 43.712910 | -79.367798
0-2506698 | 20/11/2014 10:43 | 43.713322 | -79.359741
0-2506698 | 20/11/2014 10:39 | 43.713341 | -79.359741
0-2506629 | 20/11/2014 10:07 | 48.412701 | -89.248047
0-2506629 | 20/11/2014 10:02 | 48.412720 | -89.248047
0-2506629 | 20/11/2014 10:01 | 48.412788 | -89.248108
0-2506698 | 20/11/2014 09:26 | 43.714870 | -79.357758
0-2506698 | 20/11/2014 09:21 | 43.714729 | -79.357819
0-2506698 | 20/11/2014 07:15 | 43.993961 | -79.229401
0-2506698 | 20/11/2014 07:11 | 44.018250 | -79.230591
0-2506629 | 19/11/2014 19:01 | 48.412682 | -89.247887
0-2506629 | 19/11/2014 16:53 | 48.412670 | -89.247993
0-2506629 | 19/11/2014 16:48 | 48.412670 | -89.247963
0-2506208 | 19/11/2014 16:43 | 48.399891 | -89.257599
0-2506629 | 19/11/2014 16:39 | 48.404961 | -89.252808
0-2506208 | 19/11/2014 16:38 | 48.399940 | -89.257721
0-2506698 | 19/11/2014 16:37 | 44.096931 | -79.129028
0-2506208 | 19/11/2014 16:33 | 48.399872 | -89.25769
0-2506698 | 19/11/2014 16:32 | 44.096951 | -79.129059
0-2506208 | 19/11/2014 16:31 | 48.402531 | -89.254089
0-2506698 | 19/11/2014 16:27 | 44.080601 | -79.15979
0-2506698 | 19/11/2014 15:07 | 43.765202 | -79.376801
0-2506698 | 19/11/2014 14:59 | 43.732059 | -79.440338
0-2507419 | 19/11/2014 14:49 | 48.399891 | -89.25766
0-2507419 | 19/11/2014 14:43 | 48.399879 | -89.25766
0-2507419 | 19/11/2014 14:38 | 48.399830 | -89.257721
0-2507419 | 19/11/2014 14:34 | 48.399899 | -89.25769
0-2507419 | 19/11/2014 14:00 | 48.399872 | -89.25766

我们所要做的就是根据 Spot_Log.est_dt 列为 Spot 表中列出的每辆车选择最新数据,如下所示:

ESN       | Department | VehicleModel   | AssignedToName | est_dt           | latitude  | longitude 
----------------------------------------------------------------------------------------------------
0-2506698 | 23         | 2014 Equinox   | Ron            | 20/11/2014 11:08 | 43.712910 | -79.367798
0-2507419 | 32         | 2015 Sierra    | Chuck          | 19/11/2014 14:49 | 48.399891 | -89.25766
0-2506208 | 32         | 2015 Sierra    | Don            | 19/11/2014 16:43 | 48.399891 | -89.257599
0-2506629 | 32         | 2014 Silverado | Jonathan       | 20/11/2014 10:07 | 48.412701 | -89.248047

由于目前 Spot 表中有 4 条记录,因此它应该返回 4 条最新记录。

我尝试了以下查询,尽管存在 DISTINCT 并且提到了联接条件,但它们还是显示了所有行

SELECT  s.ESN, s.AssignedToName, s.Department, sl.est_dt, sl.latitude, sl.longitude
FROM    SpotTrace s, SpotTrace_Log sl
WHERE   s.ESN = sl.ESN_ID 
ORDER   BY s.ESN, sl.est_dt DESC;

SELECT  DISTINCT s.ESN, s.AssignedToName, s.Department, sl.est_dt, sl.latitude, sl.longitude
FROM    SpotTrace s, SpotTrace_Log sl
WHERE   s.ESN = sl.ESN_ID 
ORDER   BY s.ESN, sl.est_dt DESC

我也尝试过 Limit 4,但它只显示所有行的前 4 行,如上所示。

SELECT  DISTINCT s.ESN, s.AssignedToName, s.Department, sl.est_dt, sl.latitude, sl.longitude
FROM    SpotTrace s, SpotTrace_Log sl
WHERE   s.ESN = sl.ESN_ID 
ORDER   BY s.ESN, sl.est_dt DESC
LIMIT   4;

感谢您的热心帮助。

最佳答案

我认为问题来自于您适用于所有属性的独特之处。

你有没有尝试过类似的事情:

SELECT s.ESN, s.AssignedToName, s.Department, sl.est_dt, sl.latitude, sl.longitude
FROM SpotTrace s
JOIN SpotTrace_Log sl on s.ESN = sl.ESN_ID AND MAX(est_dt)
ORDER BY s.ESN 

关于MySQL - 需要根据子表中的日期/时间列获取父表中每条记录的最新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27045899/

相关文章:

php - MySQL 不同内连接

java - 如何将对象转换为对 Java 模板有用的对象?

mysql - 删除 MySQL 中连续重复行的有效方法

php - 尝试使用 mysql php 获取某些值?

MySQL:如何连接两个表的某些行不匹配

mysql - 根据parrentid从同一张表中获取值

mysql - 拒绝用户 'root' @'localhost' 访问数据库 'drupal'

mysql - brew mysqld 未启动

php - php页面的等待时间

php - 如何创建一个以php变量作为表名的表?