我正在研究MySQL中的查询,该查询将为我提供特定ID的最新时间戳,但保留列中的空值,组合使得很难做到。
在我的日志数据库中,我知道如果最新记录包含错误消息,则可以将其视为"失败"但是使用group by会向我提供该消息的最新错误消息,无论它是否为最新记录。
Select MAX(Timestamp), CountryCode, ErrorMsg, MsgID from messages where
CountryCode = 'AU' group by MsgID;
因此,我尝试使用 MAX(时间戳)选择最新值以获取该消息的最新记录,以便我可以检查 ErrorMsg <是否< / em>列为空。
上面的查询将提供以下输出;
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列。
是否可以使用可以使用的组替代方案?
答案 0 :(得分: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的一部分,也不适用于其他数据库(在标准和其他一些数据库中允许这种情况的情况非常有限)。