MySQL通过时间戳和用户提取最新的日志条目

时间:2014-09-07 02:49:48

标签: mysql logging timestamp extract

我有一张这样的表:

id(PRIMARY KEY,AUTO_INCREMENT)|| user_id ||时间戳|| data1 || data2 || data3(...)

我需要为每个user_id("最新的行")提取单个数据,即相对于表中的最新时间戳。

这里给出的答案很好,但是我关心这个查询的性能: MySQL - using GROUP BY and DESC

我也在这里测试了一些答案,但收到了#34;参数太少"错误和空查询: https://stackoverflow.com/a/7306288/2715309

Select only newest grouped entries

由于我将唯一的auto_inc列作为主键这一事实,我做错了什么以及最佳方式是什么?

由于

1 个答案:

答案 0 :(得分:1)

第一个答案中的选定答案使用了显式记录的MySQL扩展程序,并不总是有效(并且我对该答案发表了评论)。有趣的是,Stack Overflow似乎不允许我输入文档页面的链接,但它在这里:http://dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html)。

如果您使用相关子查询或加入,第二个版本可以工作:

select *
from table t
where t.timestamp = (select max(t2.timestamp)
                     from table t2
                     where t2.user_id = t.user_id
                    );

如果您有table(user_id, timestamp)的索引,那么这应该具有合理的性能。

与此类似的版本使用join聚合:

select t.*
from table t join
     (select t2.user_id, max(t2.timestamp) as maxts
      from table t2
      group by t2.user_id
     ) tmax
     on t2.user_id = t.user_id and t2.maxts = t.timestamp;

编辑:

尝试使用相同索引的此变体:

select *
from table t
where not exists (select 1
                  from table t2
                  where t2.user_id = t.user_id and t2.timestamp > t.timestamp
                 );

这是我通常推荐的形式。