Php 使用内部联接从表中检索最新的时间戳行

Php 使用内部联接从表中检索最新的时间戳行,php,mysql,sql,Php,Mysql,Sql,要从表中检索名称行的最新时间戳。但是,只有表“location”具有时间戳。 我使用内部连接将表“elderly1”和“location”连接在一起。我只能显示我已从表“位置”检索到最新的时间戳,但没有检索到最新的“纬度”和“经度”。请帮忙 查询 如果(arduino_mac,timestamp)元组在位置表中是唯一的,则可以执行以下操作: SELECT e.name , e.illness , e.patient_id , e.patient_image

要从表中检索名称行的最新时间戳。但是,只有表“location”具有时间戳。 我使用内部连接将表“elderly1”和“location”连接在一起。我只能显示我已从表“位置”检索到最新的时间戳,但没有检索到最新的“纬度”和“经度”。请帮忙

查询 如果(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有两个(或更多)行具有相同的最新“timestamp”值,则此查询将检索具有该匹配时间戳的所有行,并且不确定在GROUP BY操作之后将保留哪些行。(如果我们保证(arduino_mac,timestamp)是唯一的,这不会成为问题。在更一般的情况下。)


同样,如果在
elder
中有多行具有相同的
名称
值,并且具有不同的arduino_mac值,则检索并返回匹配的
位置
行是不确定的。

在不知道每个表的候选键的情况下很难说很多,但通常您需要t确保
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

这是您正在运行的查询吗?它很难读取,但看起来您应该在选择列表中获得“不能使用e.patient_id,e.disease…”,因为它不包含在聚合函数中“@artm-
MySQL
默认使用它。您不需要使用相同条件的
WHERE
子句复制显式的
连接还有另一个问题要问。我还有另一个问题要问。@Lennart如果我要添加另一个表,“zones”带有值“id”(AI)、“zone_name”和“password”,用于会话目的,并使用“zones”中的“zone_name”与elderly1中的“zone_name”匹配,以仅显示特定区域内的患者进行特定会话。请提供帮助。谢谢
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