我试图在我的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菜鸟,只是为了好玩而这样做)所以我现在很困惑..
感谢您的帮助!
编辑:哇谢谢所有回复!对不起,我应该说“我想要每个主机名最新的日志!” < - 这是我特别需要的。答案 0 :(得分: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
答案 1 :(得分:1)
如果您想要与每个不同hostName
的最大ID对应的完整行,
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
答案 2 :(得分:1)
另一种做同样事情的方法是GROUP BY
然后JOIN
到日志表:
如果“latest”表示最大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 ;
更新:您可能还想尝试这个。它可能更有效(取决于主机名分布) - 并且可以从索引中受益:(hostname, id, time)
索引:
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查询返回错误结果?” 问题,这是另一个问题,其中包含一些有用的答案: Why does MySQL add a feature that conflicts with SQL standards?
答案 3 :(得分: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