2016-04-21 79 views
0

我工作的一個查詢在MySQL中,這將給我的最新時間戳爲特定的ID,但保留它在列空值時,一些按使得它很難去做。SQL - 獲取最新的記錄ID,並保留空列

在我的日誌數據庫中,我知道,如果最新的記錄包含可以被認爲是一個錯誤消息「失敗」,但使用GROUP BY讓我該消息的最新的錯誤信息,如果不考慮它的最新記錄。

Select MAX(Timestamp), CountryCode, ErrorMsg, MsgID from messages where 
CountryCode = 'AU' group by MsgID; 

所以我想選擇與MAX(時間戳)最新值來獲取該信息的最新記錄,這樣我那麼可以檢查ERRORMSG列是否爲空。

上述查詢將給出以下輸出;

Timestamp   CountryCode  ErrorMsg  MsgId 
2016-04-11 03:10:32  AU  Queued for retry 23 
2016-04-11 05:23:42  AU  Queued for retry 24 
2016-04-11 05:50:40  AU       25 
2016-04-11 08:19:43  AU       26 
2016-04-11 08:40:06  AU  Queued for retry 32 
2016-04-11 08:40:50  AU  Queued for retry 33 

如果我看看上面有錯誤消息的消息,那麼他們的最新消息有一個空的ErrorMsg列。

是否有組的替代由可使用的?

回答

1

我總是試圖使用where此:

select m.* 
from messages m 
where m.timestamp = (select max(m2.timestamp) from messages m2 where m2.msgid = m.msgid); 

爲了獲得最佳性能,你想在messages(msg_id, timestamp)的索引。

請注意,您的查詢使用MySQL(mis)功能,允許select中不在group by中的列。我不鼓勵你這樣做,除非你真的真的知道你在做什麼。通常,這不是標準SQL的一部分,並且在其他數據庫中不起作用(在標準和其他數據庫中允許這種情況的情況非常有限)。

+0

永遠不會跨過我的腦海,謝謝! – HenrikM