【问题标题】:MySQL LEFT JOIN dates with orderMySQL LEFT JOIN 日期与顺序
【发布时间】:2014-06-02 17:09:19
【问题描述】:

我有以下表格:

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

如果有任何帮助,我将不胜感激,谢谢。

【问题讨论】:

    标签: mysql sql date join left-join


    【解决方案1】:

    也许这可以做到 - 嵌套选择?

            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
    

    【讨论】:

      【解决方案2】:

      试试这个就行了

      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  
      

      【讨论】:

        【解决方案3】:

        试试这个查询,它会生成你需要的准确输出

            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;
        

        【讨论】:

          【解决方案4】:

          我认为LEFT JOIN 在这里没有必要(仅在sensors.idmeasurements.sensor_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
          

          【讨论】:

          • 我收到You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM measurements
          • 只需从MAX(m.generated_at) as last_value_generated_at, 中取出逗号,查询就可以工作了
          • @Abhik Chakraborty:谢谢 :)
          • +1 为答案!因为它处理了许多用途,例如在加入时使用 min() max() 丢失字段顺序。
          【解决方案5】:

          我希望这对你有用,

          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-04-03
            • 1970-01-01
            • 2012-04-02
            • 2013-09-11
            • 2022-06-10
            • 1970-01-01
            • 2023-04-06
            相关资源
            最近更新 更多