用not exists去重的例子

有两张表loginrecords(登录记录)和trusteddevices(信任设备),这两张表通过设备的Id关联,现在想查出每个信任设备最近的一条登录记录应该怎么写SQL语句呢?

分析一下,我们可以先选出某个信任设备的所有登陆记录,然后去除掉重复记录只保留LoginTime最大的那一条。事实上用not exists可以实现。语句如下:

select d.*,a.* from trusteddevices d left join loginrecords a on d.Id = a.deviceId where (not exists ( select b.* from loginrecords b where b.deviceId = a.deviceId and a.LoginTime < b.LoginTime));

但是not exists只适合数据量不大而且最好有索引的情况下,当数据越来越多的时候执行起来会比较费时间。

想办法优化一下SQL语句,去重我们会想到用distinct,但是distinct *是作用于所有列的,往往只用来返回不重复记录的条数,并不能帮我们筛选出想要的数据。

实际上可以用如下语句完成优化:

select d.*,r.* from trusteddevices d left join loginrecords r on r.deviceId = d.Id where r.Id = (select Id from loginrecords where DeviceId = d.Id order by LoginTime desc limit 1);

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 岁月用四季唤醒沉睡的灵魂 春夏秋冬 每个季节都是梦想的警钟 春天用鸟语花香拥你入怀 满是柔情与希望 夏天用炙热催你...
    菜头小紫阅读 386评论 3 4
  • 写在前面:我们热爱这个世界时,才真正活在这个世界上。 ——泰...
    映月黑珍珠阅读 294评论 19 6