GROUP BY 条件查询最新时间记录

版权声明:每一篇原创文章都是我的心血,欢迎转载,但请转载前留个评论,感谢您的支持!!! https://blog.csdn.net/Tim_phper/article/details/78339952

概述:

最近项目一个查询需求是从一个表中同一个IP多条记录的只获取一条IP记录,而这条IP记录要最新的。很明显需求没什么难,分组当然想到的是group by,但是这里是有个时间条件筛选的。虽然网上很多答案,但是我发现实际操作上是没有生效的,不知道是MYSQL版本问题还是答主们只是理论而没有实际尝试过,这里分享一下我的处理方式。

准备:

1、首先看我准备了同一个IP两条数据,时间不一样的。
这里写图片描述
2、然后我们尝试一下,直接group by 获得的是哪一条数据。
这里写图片描述
3、从上图可知,分组是实现了,但是并不是自己想要的最新时间的那条记录。到此,如果你尝试从网上搜索具体的解决方法,你会发现大多数答主会告诉你,对group by 的表先进行时间排序作为子查询提供给group by 就能解决。大多数答案如下图。
这里写图片描述
那么如果我们按照这答案调整SQL再查询一次呢?
这里写图片描述
到这里就傻眼了吧?说好的能解决问题呢?甚至答主连搜索结果截图都给出来了,可自己为什么就还是没有得到想要的结果呢?我猜可能是版本问题吧。我这里的版本是
这里写图片描述
4、那么我们分析一下需求和解决方法吧,我们需要的是最新时间,强调的是一个“最”,那么聪明的你想到了什么了没有?对!就是聚合函数max(),我们可以分步来,先查分组每个IP的最新时间再根据最新时间作为条件进行条件搜索就好。
查分组每个IP的最新时间子查询:
这里写图片描述
然后组合语句:
这里写图片描述
以上就是我的答案,不过以上答案我是为了方便您们理解只用了一个IP进行查询,那么我们再看看如果这样的方法在多个IP中会不会失效。
表中的数据:
这里写图片描述
其他答主不生效的方法试一下,以防冤枉别人了:
这里写图片描述
很遗憾,还是不行!
我的方法:
这里写图片描述
最终多个IP测试也是成功的。

总结:

网上搜索出来别人的答案,尽管别人截图都有了,但是还是有可能不适合自己的,关键是自己会思考改进。同时,我这方法可能不是最简洁的SQL,我希望我这里能起到一个抛砖引玉的作用,有更好答案的您们,欢迎留言交流!!!

修正:

感谢评论区的网友指出当两个ip时间相同时,会因为查询max_time的子查询查出来的数据重复,从而导致最终查出来的结果也是重复的,针对该问题,目前想到的解决方法是加多一层分组来处理max_time的重复,如下图:
这里写图片描述
如果有更好的方法,欢迎提出指导。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页