SQL分组排序后取每组最新一条数据的另一种思路
在hibernate框架和mysql、oracle两种数据库兼容的项目中实现查询每个id最新更新的一条数据。
之前工作中一直用的mybatis+oracle数据库这种,一般写这类分组排序取每组最新一条数据的sql都是使用row_number() over()函数来实现
例如:
select t1.* from (
select t.*,
ROW_NUMBER() over(partition t.id order by t.update_time desc) as rn
from table_name t
) t1 where t1.rn = 1;
但是新公司项目是兼容mysql和oracle两种数据库切换的,那么row_number() over()在使用mysql的情况下会出现错误,所以我在网上查找了一下mysql实现分组排序取最新数据的例子
有两种写法,如下:
第一种
select t1.*
from table_name t1,
(select t.id, max(t.update_time) as uTime from table_name t group by t.id) t2
where 1=1
and t1.id = t2.id
and t1.update_time = t2.uTime;
第二种(这里limit是为了固定子查询中的排序,如果没有这个limit,外层使用虚拟表t1进行group by的时候就不会根据之前update_time排好的倒序进行分组了。limit具体的数字可以根据要查询数据的总数来决定。)
select t1.* from (
select * from table_name t order by t.update_time desc limit 1000
) t1 group by t1.id;
这里又遇到了一个问题,虽然第一种方式使用mysql和oracle都可以查询,但是hibernate是不支持from (子查询) ... 这种结构的sql的,因为hibernate的核心是面向对象而非面向数据库,网上搜到是这种解决方案
解决hibernate不支持from (子查询) ... 参考地址:https://blog.csdn.net/fableking/article/details/3167081
为了一个子查询再新建一个实体类...虽然觉得这样有点麻烦但是我还是搜索了一下整个项目看有没有类似的做法,结果一个都没有找到!
这时候我请教了一下部门的老人想看看他们做这类查询是如何处理的,大佬给出的方案是换一种sql写法
如下:
select * from table_name t1 where t1.update_time= (select max(t.update_time) from table_name t where t.id= t1.id);
至此问题解决...
SQL分组排序后取每组最新一条数据的另一种思路的更多相关文章
- MySQL 分组后取每组前N条数据
与oracle的 rownumber() over(partition by xxx order by xxx )语句类似,即:对表分组后排序 创建测试emp表 1 2 3 4 5 6 7 8 9 ...
- 记一次有意思的 SQL 实现 → 分组后取每组的第一条记录
开心一刻 今天,朋友气冲冲的走到我面前 朋友:我不是谈了个女朋友,谈了三个月嘛,昨天我偷看她手机,你猜她给我备注什么 我:备注什么? 朋友:舔狗 2 号! 我一听,气就上来了,说道:走,找她去,这婆娘 ...
- MySQL 先按某字段分组,再取每组中前N条记录
按 gpcode每组 取每组 f4 最大的那条记录: 方法一: select * from calcgsdataflash a where gscode = 'LS_F' and ymd >= ...
- 【mysql】【分组】后取每组的top2
DROP TABLE IF EXISTS `tb1`; CREATE TABLE `tb1` ( `id` ) NOT NULL AUTO_INCREMENT, `a` ) DEFAULT NULL, ...
- MYSQL 按某个字段分组,然后取每组前3条记录
先初始化一些数据,表名为 test ,字段及数据为: SQL执行结果为:每个 uid 都只有 3 条记录. SQL语句为: SELECT * FROM test main WHERE ...
- SQL查询排序某字段并选前N条数据
看了网上各种乱七八糟的答案,无语. 明明这一句话就行了. select * from personinfo order by credit DESC limit 0,5
- MSSQL 分组后取每组第一条(group by order by)
查询中经常遇到这种查询,分组后取每组第一条.分享下一个SQL语句: --根据 x 分组后.根据 y 排序后取第一条 select * from ( select ROW_NUMBER() over(p ...
- mysql单列去重复group by分组取每组前几条记录加order by排序
mysql分组取每组前几条记录(排名) 附group by与order by的研究,需要的朋友可以参考下 --按某一字段分组取最大(小)值所在行的数据 复制代码代码如下: /* 数据如下: name ...
- MYSQL实现分组排序并取组内第一条数据
一.需要实现分组排序并且取组内状态优先级最高的数据 有一张这样的数据表, 需求是根据error_type分组然后取status最小的第一条数据 第一种写法: select t.* from ( sel ...
随机推荐
- PHP ignore_user_abort() 函数
实例 设置为 false(默认)- 与客户机断开会终止脚本的执行: <?phpignore_user_abort();?>高佣联盟 www.cgewang.com 上面代码的输出如下: 0 ...
- PHP levenshtein() 函数
实例 计算两个字符串之间的 Levenshtein 距离: <?php echo levenshtein("Hello World","ello World&quo ...
- ARC 062 F - Painting Graphs with AtCoDeer 割点 割边 不动点 burnside引理
LINK:Painting Graphs with AtCoDeer 看英文题面果然有点吃不消 一些细节会被忽略掉. 问每条边都要被染色 且一个环上边的颜色可以旋转. 用c种颜色有多少本质不同的方法. ...
- Python网络数据采集PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书
点击获取提取码:jrno 内容提要 本书采用简洁强大的 Python 语言,介绍了网络数据采集,并为采集新式网络中的各种数据类 型提供了全面的指导.第一部分重点介绍网络数据采集的基本原理:如何用 Py ...
- Python自动化运维 技术与最佳实践PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书
点击获取提取码:7bl4 一.内容简介 <python自动化运维:技术与最佳实践>一书在中国运维领域将有"划时代"的重要意义:一方面,这是国内第一本从纵.深和实践角度探 ...
- 利用mvc模式,实现用户的注册
实现功能:利用mvc模式,实现用户的登陆注册功能 1.程序的框架结构 2个包,bean,以及servlet 3个jsp页面,注册页面,注册成功页面,注册失败页面 mysql驱动 2.编程思想 通过js ...
- github 错误
Push failed: Unable to access 'https://github.com/infoo/Neo4j.git/': The requested URL returned erro ...
- e分钟带你利用Python制作词云图
随着大数据时代的来临,数据分析与可视化,显得越来越重要,今天给小伙伴们带来一种最常见的数据可视化图形-词云图的制作方法. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法 ...
- MYSQL 按某个字段分组,然后取每组前3条记录
先初始化一些数据,表名为 test ,字段及数据为: SQL执行结果为:每个 uid 都只有 3 条记录. SQL语句为: SELECT * FROM test main WHERE ...
- lombok的基本使用方法
在java刚开始学习的时候,首先就会学习封装.继承和多态,就拿封装来说,封装就是为了保护数据安全而将实体类内部数据保持为私有状态,如果外部程序想要访问里面的数据就必须调用此实体类提供的相关数据接口,这 ...