每天选择最后一行MySQL数据

5

尝试选择每天的最后一行。

这是我的表格(在实际表格中有更多记录):

+-----+-----------------------+------+
| 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、6和3的行。

我尝试了以下查询:

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

日期时间和温度不匹配。

祝好


请问您能详细说明一下吗:但日期时间和温度不匹配。 - R Dhaval
2个回答

7

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

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

这是 SQL Fiddle 网站。

达尔尚·梅塔:太完美了!正是我想要的。O.琼斯:id是自动递增的,行永远不会被更新。 - droid

2
如果你的行总是被插入而不是更新,并且如果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

这意味着您不能保证获取正确行的温度值。相反,它可以返回每天分组中任何一行的温度值。

感谢您的提议。id是自动递增的,行永远不会被更新。Darshan的提议很好,但我也从您的提议中学到了一些东西。我喜欢您讲述查询正在做什么的方式。 - droid
也尝试了您的建议(第一个),也运行良好。谢谢。 - droid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接