2014-04-18 28 views
1

我有如下表:MySQL的左連接的日期與秩序

sensors:

id name key code 
1 s1 abc 123 
2 s2 def 456 
3 s3 ghi 789 

measurements:

id value sensor_id generated_at 
1 1.0 1   2013-12-30 06:00:00 
2 1.0 1   2013-12-30 06:01:00 
3 1.0 1   2013-12-30 06:02:00 
4 3.0 2   2013-12-30 07:00:00 
5 3.0 2   2013-12-30 07:01:00 
6 3.0 2   2013-12-30 07:05:00 
7 5.0 3   2013-12-30 08:02:00 
8 5.0 3   2013-12-30 08:03:00 
9 5.0 3   2013-12-30 08:11:00 
10 5.0 3   2013-12-30 08:15:00 

我想要做的是產生的所有傳感器的數據報告,包括第一次和最後一次接收測量的時間爲generated_at,所以MySQL請求的結果應該如下所示:

id name key code first_value_generated_at last_value_generated_at 
1 s1 abc 123 2013-12-30 06:00:00  2013-12-30 06:02:00 
2 s2 def 456 2013-12-30 07:00:00  2013-12-30 07:05:00 
3 s3 ghi 789 2013-12-30 08:02:00  2013-12-30 08:15:00 

我將不勝感激任何幫助,謝謝。

回答

2

我不認爲LEFT JOIN是這裏真的有必要(僅在情況下,當有更多的還是比measurements.sensor_idsensors.id)。 SQL查詢低於:

SELECT 
    s.id, 
    s.name, 
    s.key, 
    s.code, 
    m.first_value_generated_at, 
    m.last_value_generated_at 
FROM sensors s JOIN 
    (SELECT 
     sensor_id, 
     MIN(generated_at) as first_value_generated_at, 
     MAX(generated_at) as last_value_generated_at 
    FROM 
     measurements 
    GROUP BY 
     sensor_id 
    ) m ON s.id = m.sensor_id 
ORDER BY 
    s.id 
+0

我得到'您的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,在'FROM measurements'附近使用正確的語法 –

+1

只需從MAX(m.generated_at)中取出逗號作爲last_value_generated_at,並且查詢應該可以工作 –

+0

@Rustam A. Gasanov:更新了我的帖子。 – potashin

1

我希望這應該爲你工作,

select * 
    ,(select min(generated_at) from measurements as a where a.sensor_id =s.id) as first_value_generated_at 
    ,(select max(generated_at) from measurements as b where b.sensor_id =s.id) as last_value_generated_at 
from sensors as s 
0

這也許能做到這一點 - 嵌套選擇?

 select sensors.id, sensors.name, sensors.key, sensors.code, 
    (select generated_at from measurements order by time asc limit 1) 
as first_value_generated_at, 
    (select generated_at from measurements order by time desc limit 1) 
as last_value_generated_at from sensors 
0

嘗試此查詢,就會產生精確的輸出,你需要

select s.id,s.name,s.key,s.code,min(m.generated_at) first_vaue_generated_at,max(m.generated_at) last_value_generated_at 
     from sensors s 
LEFT JOIN measurements m ON (s.id = m.sensor_id) 
    group by 1,2,3,4; 
0

試試這個它會工作

select s.id,s.name,s.key,s.code,m.generated_at as first_value_generated_at,ml.generated_at as last_value_generated_at from sensors as s,measurements as mf,measurements as ml where s.id = mf.sessor_id and s.id = ml.sensor_id and mf.generated_at < ml.generated_at group by mf.sensor_id