2011-03-06 7 views
0

J'ai une base de données MySQL avec une structure comme ça ...5 derniers documents relatifs à plusieurs enregistrements

site a de nombreux capteurs Capteurs a beaucoup SensorReadings

Je veux tous les capteurs pour un site et les 5 derniers SensorReadings pour tous ces capteurs. Je pense que je vais devoir faire quelque chose avec une procédure stockée et les tables temporaires (si elles existent même dans MySQL.

+0

Merci les gars, je n'ai pas encore eu l'occasion de tester ces réponses, j'espère avoir du temps dans les prochains jours et en accepter une comme réponse. Ben – BenCr

Répondre

2

Peut-être 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'il vous plaît donner à votre structure de table réelle (s) dans votre question.

+0

Cela ne fonctionne pas s'il n'y a que des lectures pour un capteur. Je posterai quelques scripts plus tard et les lierai à la question. – BenCr

+0

En outre, si je fais cela dans une procédure stockée, la première fois que je l'exécute, il retourne tout dans la table la deuxième fois c'est bien. – BenCr

+0

@BenCr - Étrange. J'ai vu une autre version de cette technique qui place les variables dans une table dérivée. Peut-être que c'est pour éviter ce genre de problème. Essaiera juste de trouver un exemple. –

1

exemple complet en utilisant des variables MySQL. par souci de concision, cela affiche les 2 lectures par capteur haut.

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

Basé sur Andomar décharge

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