2017-06-05 179 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