我有一张这样的表:
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列作为主键这一事实,我做错了什么以及最佳方式是什么?
由于
答案 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
);
这是我通常推荐的形式。