想要从表中检索名称行的最新时间戳。但是只有表“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
答案 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