从MySQL获取最新记录

3

我有一个MySQL数据库,其中包含多个记录。每个记录都有一个名称。这个名称不是唯一的,也就是说,在表中同样的名称会出现多次,因为值被更新了。 如何创建一个查询,只返回在过去5分钟内更新的最新名称(每个名称每分钟更新多次。我只想要5分钟窗口内的最新条目)。


1
很好。你能编辑你的问题并告诉我们吗?你有表结构吗?你能把 SHOW CREATE TABLE yourtable 的输出发给我们吗?帮助我们帮助你。 - Konerak
3个回答

4
你应该在表中添加一个带有时间戳的列。当行发生更改时,此列将自动初始化并更新为当前时间,因此仅需要进行简单的查询即可获取最后X分钟内更改的所有列。请参考这里了解更多关于时间戳的信息。
SELECT *
FROM yourtable
WHERE yourtimestamp  > NOW() - INTERVAL 5 MINUTE

如果没有这样的列,你实际上无法知道行何时发生了更改,除非你找到另一种跟踪更改的方法。触发器或二进制日志可以帮助解决问题,但这两种解决方案都不如添加一列简单和快速。


我觉得这可能只能部分地回答问题。原帖作者可能只想要最后更新的那条记录。 - Conrad Frix
以上代码将显示在5分钟内更新的每条记录。我只想要最近5分钟内更新的记录。 - redfrogsbinary
最近的是按什么来确定的?按用户来确定吗?可以使用 GROUP BY user 并获取 MAX(yourtimestamp)。或者在另一个具有适当唯一键的表中,使用 INSERT-ON-DUPLICATE-UPDATE 触发器进行插入或更新操作。 - Konerak

1
在您的表中添加一个TIMESTAMP列。仅选择时间戳值介于五分钟前和现在之间的记录(有关详细信息,请参见日期和时间函数)。如果您只想获取每个名称的最新更新,则可以选择按名称分组并选择具有最大时间戳值的行。

0
如果您添加了一个TIMESTAMP列,您应该能够通过执行以下查询来获取过去5分钟内添加的名称的最新值:
SELECT *
FROM yourtable AS a
WHERE a.ts = 
    (SELECT MAX(ts)
     FROM yourtable AS b
     WHERE b.ts > NOW() - INTERVAL 5 MINUTE
       AND b.name = a.name)

尝试 #2:
SELECT *
FROM yourtable AS a
INNER JOIN (SELECT name, MAX(ts) AS ts
     FROM yourtable
     GROUP BY name
     HAVING MAX(ts) > NOW() - INTERVAL 5 MINUTE) AS b
 ON a.name = b.name
AND a.ts = b.ts

这个可以运行!但是MySQL处理需要6秒钟。而且那里只有少量记录... 有没有更快的方法? - redfrogsbinary
我不理解这部分代码:AND b.name = a.name。 - redfrogsbinary
我错过了MySQL这一部分...根据我的经验,当涉及到子查询时,MySQL的性能并不是最好的。我添加了一个可能的第二种方法,但我没有测试的东西,所以不能保证它能正常工作。 - bhamby
b.name = a.name 会导致子查询成为相关子查询。在外部查询中的每个记录(在本例中为a),您都要对内部查询(b)执行查询。您可以在MySQL文档中了解有关它们的信息:http://dev.mysql.com/doc/refman/5.5/en/correlated-subqueries.html - bhamby
@redfrogsbinary:对于少量的记录而言,6秒钟是慢的(“少量”是指多少?)。你可以在这里发布你拥有的索引或者提出一个新的问题来进行速度优化。 - ypercubeᵀᴹ
几乎是 2500 条记录。这就是“几乎”吗? - redfrogsbinary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接