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

时间:2016-04-21 13:54:22

标签: mysql sql

我正在研究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列。

是否可以使用可以使用的组替代方案?

1 个答案:

答案 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的一部分,也不适用于其他数据库(在标准和其他一些数据库中允许这种情况的情况非常有限)。