1

我正在尝试在我的 MySQL 数据库中查找最新的日志条目。我昨晚深夜做了这个查询,但今天测试后它似乎没有返回正确的数据。

SELECT MAX(id), hostName, email, info, time 
FROM log
WHERE time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) 
GROUP BY hostName 
ORDER BY `time` DESC

查询运行得很好,但似乎没有其他字段与 id 列匹配。它获取最大 id 号,但 hostName、email 和 info 与 id 不匹配,并且它们不是最新的。我花了几个小时在这上面旋转我的轮子(我是一个 MySQL 菜鸟,只是为了好玩)所以我现在很困惑..

谢谢你的帮助!

编辑:哇感谢所有的回复!对不起,我应该说“我想要每个主机名的最新日志!” <- 这正是我需要的。

4

4 回答 4

2

你说:

我正在尝试在我的 MySQL 数据库中查找最新的日志条目

无需分组,也无需使用子查询。试试这个:

SELECT id, hostName, email, info, time FROM log
WHERE time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) 
ORDER BY `time` DESC

现在你说:

我想要每个主机名的最新日志!

那么解决方案应该是这样的:

SELECT l1.id, l1.hostName, l1.email, l1.info, l1.time FROM log l1
LEFT JOIN log l2 on l1.hostName = l2.hostName AND l1.time < l2.time
WHERE l2.time IS NULL
ORDER BY l1.time DESC
于 2012-06-15T13:40:28.343 回答
1

如果您想要与每个 distinct 的最大 id 对应的完整行hostName

SELECT id, hostName, email, info, time
FROM log
WHERE id IN 
    (SELECT MAX(id) FROM log WHERE time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) 
     GROUP BY hostName)
ORDER BY `time` DESC
于 2012-06-15T13:39:22.487 回答
1

另一种做同样事情的方法是GROUP BY先到JOIN日志表:

如果“最新”表示最大值id,请使用(hostname, time, id)索引,并且:

SELECT log.id
FROM 
        log
    JOIN 
        ( SELECT MAX(id) AS id
          FROM log
          WHERE time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) 
          GROUP BY hostName
        ) AS grp
      ON grp.id = log.id ;

更新:你可能想试试这个。它可能更有效(取决于主机名分布) - 并且会受益于 index: (hostname, id, time)index:

SELECT log.id
FROM 
        log
    JOIN 
        ( SELECT MAX(id) AS id
          FROM log
          GROUP BY hostName
        ) AS grp
      ON grp.id = log.id 
WHERE log.time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) ;

如果“最新”是指最大值time(例如,如果time以后insertion_time更改并且未更改),请使用(hostname, time)索引,并且:

SELECT log.*
FROM 
        log
    JOIN 
        ( SELECT hostname, MAX(time) AS max_time
          FROM log
          WHERE time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) 
          GROUP BY hostname
        ) AS grp
      ON  grp.hostname = log.hostname
      AND grp.max_time = log.time ;

最后,由于每个人都忘了回答“为什么 mysql 查询返回错误的结果?” 问题,这里还有一个问题有一些有用的答案: 为什么 MySQL 会添加一个与 SQL 标准冲突的特性?

于 2012-06-15T13:49:54.053 回答
0

这是一个著名的:

SELECT *
FROM log
WHERE log.id IN (
    SELECT MAX(id)
    FROM log
    WHERE time >= DATE_SUB(NOW(), INTERVAL 1 HOUR) 
    GROUP BY hostName) T
于 2012-06-15T13:39:13.440 回答