提问者:小点点

SQL-获取ID的最新记录并保留空列


我在MySQL中处理一个查询,它会给我一个特定ID的最新时间戳,但在列中保留它的空值,这是group by使它很难做到的。

在我的日志数据库中,我知道如果最新记录包含错误消息,则可以将其视为“失败”,但使用group by会给我该消息的最新错误消息,而不管它是否是最新记录。

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

因此,我尝试选择带有MAX(Timestamp)的最新值来获取该消息的最新记录,以便检查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

是否有一种替代分组的方法可以使用?


共1个答案

匿名用户

我总是想使用,其中:

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

为了获得最佳性能,需要消息(msg_id,timestamp)的索引。

请注意,您的查询使用了MySQL(mis)特性,该特性允许select中的列不在组by中。我不鼓励你这样做,除非你真的,真的,真的知道你在做什么。通常,这不是标准SQL的一部分,在其他数据库中也不起作用(在标准和其他一些数据库中允许这样做的情况非常有限)。