最近接到一个开发任务,有一个用户操作日志表, 里面包含用户id, 用户最近访问内容和时间. 需要查询到用户列表中每一个用户最近操作的内容

我开始想到的是使用 group by 分组, 然后 order by 时间字段. 但是由于MySQL的执行顺序是先执行 group 后执行 order, 经过group之后的内容已经丢失了时间, 所以无法使用该方法实现. 然后在网上找到一种方式, 是通过 right join 自己, 然后取内容. 但是也比较复杂, 后来找到了一个方式比较简单, 在此记录备忘.

其主要逻辑使用了not exists, 然后通过子查询拿到最新数据, 通过 WHERE t1.user_id = t2.user_id 建立关联, 其中user_id即为两表之间的关联字段.

SELECT
	user_id,
	t1.login_time 
FROM
	tb_user_login t1 
WHERE
	NOT EXISTS ( SELECT 1 FROM tb_user_login t2 WHERE t1.user_id = t2.user_id AND t1.login_time < t2.login_time )

对应的表数据如下:
数据库表内容

查询出来的结果如下:
查询结果

更新

上面的那种方式有严重的性能问题, 执行一次查询竟然要0.4S, 后来在知乎找到了这篇问题,下面 有挺多方式解决这个问题的。 知乎链接