2016-04-21 42 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