最近接到一个开发任务,有一个用户操作日志表, 里面包含用户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, 后来在知乎找到了这篇问题,下面 有挺多方式解决这个问题的。 知乎链接