0

我有一个名为 sensorvalue 的表,如下所示:

station_id   sensor_id   Timestamp            Value
----------------------------------------------------------
1            1           2013-09-04 12:00:00  12.2
1            2           2013-09-04 12:00:00  13.1
1            3           2013-09-04 12:00:00  13.2
1            1           2013-09-04 12:05:00  12.1
1            2           2013-09-04 12:05:00  14.1
1            3           2013-09-04 12:05:00  13.2
1            1           2013-09-04 12:10:00  12.5
1            2           2013-09-04 12:10:00  13.3
1            3           2013-09-04 12:10:00  14.1

我需要一个 MySQL 查询来获取所有三个带有 station_id 1 的站传感器的所有最新值。我想知道这是否可以通过一个 MySQL 语句来实现。

我已经设法从表中取出数据,但不是以一种有效的方式。现在我首先为站 1 选择所有不同的传感器,然后我为每个传感器调用另一个 MySQL SELECT 语句。一些站有超过 10 个传感器,所以使用这种方法,我需要至少 11 个 MySQL 语句才能从数据库中获取数据。

我想将它包含在一个 MySQL 语句中。那可能吗?如何?

4

2 回答 2

2

有多种写法。以下可能是最简单的代码,使用substring_index()/group_concat()技巧:

select sensor_id, max(TimeStamp),
       substring_index(group_concat(Value) order by TimeStamp desc), ',', 1) as LastValue
from sensorvalue sv
where station_id = 1
group by sensor_id;

编辑:

所有时间戳值看起来都一样。如果这是真的,你也可以这样做:

select sv.*
from sensorvalue sv
where station_id = 1 and
      timestamp = (select max(timestamp) from sensorvalue where station_id = 1);
于 2013-09-04T15:27:58.660 回答
0

检索所有站点上所有传感器的最新读数。

SELECT s.*
  FROM (SELECT station_id, sensor_id, MAX(Timestamp) as max_timestamp
          FROM sensorvalue
         GROUP BY station_id, sensor_id
       ) m
  JOIN sensorvalue s
    ON s.station_id = m.station_id
   AND s.sensor_id  = m.sensor_id
   AND s.Timestamp  = m.max_timestamp

将其限制在特定站点。

SELECT s.*
  FROM (SELECT station_id, sensor_id, MAX(Timestamp) as max_timestamp
          FROM sensorvalue
         WHERE station_id = 1
         GROUP BY station_id, sensor_id
       ) m
  JOIN sensorvalue s
    ON s.station_id = m.station_id
   AND s.sensor_id  = m.sensor_id
   AND s.Timestamp  = m.max_timestamp
于 2013-09-04T15:33:36.813 回答