2011-03-06 129 views
0

我有这样的结构的MySQL数据库...最近5个相关记录多个记录

网站有很多传感器 传感器有许多SensorReadings

我想获得一个网站的所有传感器和所有这些传感器的最后5次SensorReading。我怀疑,我将不得不做一些与存储过程和临时表(如果他们甚至在MySQL存在。

+0

感谢球员们,我还没有机会测试任何这些答案,但我希望在接下来的几天里有时间并接受一个答案。本 – BenCr 2011-03-08 09:57:25

回答

2

可能Something like ...

SELECT reading, 
     date 
FROM (select sensor_id, 
       reading, 
       date, 
       @num := if(@sensor_id = sensor_id, @num + 1, 1) as row_number, 
       @sensor_id := sensor_id       as dummy 
     from sensor_readings 
     order by sensor_id, 
        date desc) T 
WHERE row_number<=5 

请给你的实际的表结构(S )在您的问题。

+0

如果只有一个传感器的读数,这不起作用。我稍后会发布一些脚本并在问题中链接到它们。 – BenCr 2011-03-28 13:31:53

+0

另外,如果我把它变成一个存储过程,第一次运行它,它会返回表中的所有内容,第二次是正常的。 – BenCr 2011-03-28 20:15:03

+0

@BenCr - 奇怪。我已经看到了这种技术的另一个版本,它将变量放入派生表中。也许这是为了避免这种问题。只会尝试找到一个例子。 – 2011-03-28 20:18:20

1
使用MySQL变量

完整的示例。为简便起见,这显示每个传感器顶端2的读数。

drop table if exists Sensors; 
create table Sensors (Id int); 
insert Sensors (id) values (1), (2), (3); 

drop table if exists SensorReadings; 
create table SensorReadings (SensorId int, RecordDate date); 
insert SensorReadings (SensorId, RecordDate) values 
    (1, '2011-01-01'), 
    (1, '2011-01-02'), 
    (1, '2011-01-03'), 
    (2, '2011-01-01'), 
    (2, '2011-01-02'), 
    (2, '2011-01-03'); 


set @num = -1; 
set @SensorId = -1; 

select * 
from Sensors s 
join (
     select * 
     ,  @num := if(@SensorId = SensorId, @num + 1, 1) as rn 
     ,  @SensorId := SensorId 
     from SensorReadings sr 
     order by 
       SensorId 
     ,  RecordDate desc 
     ) as numbered 
on  numbered.SensorId = s.Id 
where numbered.rn < 3; 
0

基于Andomar转储

select * from SensorReadings as t1 
where (select count(*) from SensorReadings as t2 
     where t1.sensorid = t2.sensorid and t2.recordDate > t1.recordDate) <2