另一种做同样事情的方法是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 标准冲突的特性?