2014-04-18 27 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