使用INNER JOIN从表中检索最新的时间戳行

时间:2014-10-01 03:28:37

标签: php mysql sql

想要从表中检索名称行的最新时间戳。但是只有表“location”具有时间戳。 我使用INNER JOIN将“老人1”和“位置”表连在一起。我只能表明我已从表“位置”检索到最新的时间戳而不是最新的“纬度”和“经度”。请帮忙。

查询

SELECT e.name,e.illness, e.patient_id,e.patient_image,e.area, e.arduino_mac,
       l.arduino_mac, l.latitude, l.longitude,MAX(l.timestamp) as ts 
FROM elderly1 e 
JOIN location l 
    on e.arduino_mac = l.arduino_mac 
WHERE e.arduino_mac = l.arduino_mac 
GROUP BY e.name 
ORDER BY l.timestamp

2 个答案:

答案 0 :(得分:1)

如果(arduino_mac,timestamp)元组在位置表中是唯一的,你可以这样做:

SELECT e.name
     , e.illness
     , e.patient_id
     , e.patient_image
     , e.area
     , e.arduino_mac
     , l.arduino_mac
     , l.latitude
     , l.longitude
     , l.timestamp
  FROM elderly1 e
  JOIN ( SELECT d.arduino_mac
              , MAX(d.timestamp) AS latest_ts
           FROM location d
          GROUP BU d.arduino_mac
       ) f
    ON f.arduino_mac = e.arduino_mac
  JOIN location l
    ON l.arduino_mac = f.arduino_mac
   AND l.timestamp   = f.lastest_ts
 GROUP BY e.name
 ORDER BY l.timestamp

内嵌视图f获取"最新时间戳"对于arduino_mac的每个值。 (如果有合适的索引可用,则视图查询的性能最佳,例如

  ... ON location (arduino_mac,timestamp)

我们可以使用timestamp的值来检索该行上的其他列,并加入location表。

请注意,如果有两个(或更多)行具有相同的最新"时间戳"给定arduino_mac的值,然后此查询将检索具有该匹配时间戳的所有行,并且在GROUP BY操作之后将保留这些行中的哪一行是不确定的。 (如果我们保证(arduino_mac,时间戳)是唯一的,这不会成为一个问题。在更一般的情况下。)

同样,如果name中有多个行具有相同的elderly值,并且arduino_mac的值不同,则不确定哪个匹配location检索并返回行。

答案 1 :(得分:0)

如果不知道每个表的候选键,很难说很多,但一般来说,您必须确保SELECT子句在功能上依赖于GROUP BY子句。鉴于你提出的问题,我建议像:

SELECT e.name,e.illness, e.patient_id,e.patient_image,e.area, e.arduino_mac,
       l.arduino_mac, l.latitude, l.longitude, l.timestamp as ts 
FROM elderly1 e 
JOIN ( SELECT l1.arduino_mac, l1.latitude, l1.longitude, l1.timestamp
       FROM location l1
       WHERE timestamp = ( SELECT MAX(timestamp)
                           FROM LOCATION l2
                           WHERE l1.arduino_mac = l2.arduino_mac )
) as l
    on e.arduino_mac = l.arduino_mac 
ORDER BY l.timestamp