2017-06-05 144 views
1

试图每天选择最后一行。MySQL每天选择最后一行

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

+-----+-----------------------+------+ 
| 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; 

但datetime和temp不匹配。

亲切的问候

+0

请您详细说明一下:*但日期时间和温度不匹配。* –

回答

2

这里有一种方法,它得到每天MAX日期,然后其用在INNER查询来获取其它领域:

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

这里的SQL Fiddle

+0

Darshan Mehta:完美!只是想我想要的。 O.琼斯:id是自动增量,行从不更新。 – droid

0

如果你的行总是插入和从不更新,如果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

它应该正确使用the ANY_VALUE() function来强调结果的不可预测性。它应该读....

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

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

+0

感谢您的提议。 id是自动增量的,行从不更新。 Darshan的建议奏效了,但我也从你那里学到了一些东西。我喜欢你正在告诉查询正在做什么。 – droid

+0

也试过你的建议(第一个),这也工作得很好。谢谢。 – droid