繁体   English   中英

MySQL每天选择最后一行

[英]MySQL select last row each day

尝试每天选择最后一行。

这是我的(简化的,实际表中有更多记录)表:

+-----+-----------------------+------+
| id  |       datetime        | temp |
+-----+-----------------------+------+
|  9  | 2017-06-05 23:55:00   | 9.5  |
|  8  | 2017-06-05 23:50:00   | 9.6  |
|  7  | 2017-06-05 23:45:00   | 9.3  |
|  6  | 2017-06-04 23:55:00   | 9.4  |
|  5  | 2017-06-04 23:50:00   | 9.2  |
|  4  | 2017-06-05 23:45:00   | 9.1  |
|  3  | 2017-06-03 23:55:00   | 9.8  |
|  2  | 2017-06-03 23:50:00   | 9.7  |
|  1  | 2017-06-03 23:45:00   | 9.6  |
+-----+-----------------------+------+

我想选择id = 9,id = 6和id = 3的行。

我已经尝试过以下查询:

SELECT MAX(datetime) Stamp
     , temp 
  FROM weatherdata 
 GROUP 
    BY YEAR(DateTime)
     , MONTH(DateTime)
     , DAY(DateTime) 
 order 
    by datetime desc 
 limit 10;

但是日期时间和温度不匹配。

亲切的问候

这是一种获取每天MAX日期,然后在INNER查询中使用它来获取其他字段的方法:

SELECT * 
FROM test
WHERE `datetime` IN (
  SELECT MAX(`datetime`) 
  FROM test
  GROUP BY DATE(`datetime`)
 );

这是SQL Fiddle

如果您的行总是插入而从未更新,并且id是自动递增的主键,则

SELECT w.*
  FROM weatherdata w
  JOIN (   SELECT MAX(id) id
             FROM weatherdata
            GROUP BY DATE(datetime)
       ) last ON w.id = last.id

会得到你想要的东西。 为什么? 内部查询返回weatherdata每个日期的最大(意味着最近的) id值。 这确实可以非常快,尤其是如果您在datetime列上放置了索引。

但是可能无法满足此条件。 如果您的datetime列有时会更新以更改日期,则较大的id值可能并不总是意味着较大的datetime值。

在这种情况下,您需要像这样的东西。

SELECT w.*
  FROM weatherdata w
  JOIN (   SELECT MAX(datetime) datetime
             FROM weatherdata
            GROUP BY DATE(datetime)
       ) last ON w.datetime = last.datetime

您的查询无效,因为它滥用了对MySQL GROUP BY的讨厌的非标准扩展。 阅读此内容: https : //dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

它应该正确地使用ANY_VALUE()函数突出显示结果的不可预测性。 应该阅读....

SELECT MAX(datetime) Stamp, ANY_VALUE(temp) temp

这意味着您不能保证右行的临时值。 相反,它可以从每天分组的任何行中返回临时值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM