高级MySQL查询,以获取具有相同ID和不同子标识的最新记录范围

时间:2013-09-04 15:22:20

标签: mysql

我有一个名为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语句中包含它。那可能吗?怎么样?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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