在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分组排序后取每组最新一条数据的另一种思路的更多相关文章

  1. MySQL 分组后取每组前N条数据

    与oracle的 rownumber() over(partition by xxx  order by xxx )语句类似,即:对表分组后排序 创建测试emp表 1 2 3 4 5 6 7 8 9 ...

  2. 记一次有意思的 SQL 实现 → 分组后取每组的第一条记录

    开心一刻 今天,朋友气冲冲的走到我面前 朋友:我不是谈了个女朋友,谈了三个月嘛,昨天我偷看她手机,你猜她给我备注什么 我:备注什么? 朋友:舔狗 2 号! 我一听,气就上来了,说道:走,找她去,这婆娘 ...

  3. MySQL 先按某字段分组,再取每组中前N条记录

    按 gpcode每组 取每组 f4 最大的那条记录: 方法一: select * from calcgsdataflash a where gscode = 'LS_F' and ymd >= ...

  4. 【mysql】【分组】后取每组的top2

    DROP TABLE IF EXISTS `tb1`; CREATE TABLE `tb1` ( `id` ) NOT NULL AUTO_INCREMENT, `a` ) DEFAULT NULL, ...

  5. MYSQL 按某个字段分组,然后取每组前3条记录

    先初始化一些数据,表名为 test ,字段及数据为: SQL执行结果为:每个 uid  都只有 3 条记录.   SQL语句为: SELECT   * FROM   test main WHERE   ...

  6. SQL查询排序某字段并选前N条数据

    看了网上各种乱七八糟的答案,无语. 明明这一句话就行了. select * from personinfo order by credit DESC limit 0,5

  7. MSSQL 分组后取每组第一条(group by order by)

    查询中经常遇到这种查询,分组后取每组第一条.分享下一个SQL语句: --根据 x 分组后.根据 y 排序后取第一条 select * from ( select ROW_NUMBER() over(p ...

  8. mysql单列去重复group by分组取每组前几条记录加order by排序

    mysql分组取每组前几条记录(排名) 附group by与order by的研究,需要的朋友可以参考下 --按某一字段分组取最大(小)值所在行的数据 复制代码代码如下: /* 数据如下: name ...

  9. MYSQL实现分组排序并取组内第一条数据

    一.需要实现分组排序并且取组内状态优先级最高的数据 有一张这样的数据表, 需求是根据error_type分组然后取status最小的第一条数据 第一种写法: select t.* from ( sel ...

随机推荐

  1. HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第5章CSS盒子模型

    本教程案例在线演示 有路网PC端 有路网移动端 教程配套源码资源 教程配套源码资源 div div 可定义文档中的分区(division). div 标签可以把网页分割为独立的.不同的部分. 可以看成 ...

  2. PHP trigger_error() 函数

    定义和用法 trigger_error() 函数创建用户自定义的错误消息. trigger_error() 函数用于在用户指定的条件下触发一个错误消息.它可以与内建的错误处理程序一起使用,或者与由 s ...

  3. 实验10—— java读取歌词文件内容动画输出

    1.Read.java package cn.tedu.demo; import java.io.BufferedReader; import java.io.File; import java.io ...

  4. swift 5.0 创建button方法

    class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any ...

  5. .Net Core HttpClient处理响应压缩

    前言     在上篇文章[ASP.NET Core中的响应压缩]中我们谈到了在ASP.NET Core服务端处理关于响应压缩的请求,服务端的主要工作就是根据Content-Encoding头信息判断采 ...

  6. 仅需1秒!搞定100万行数据:超强Python数据分析利器

    前言 使用Python进行大数据分析变得越来越流行.这一切都要从NumPy开始,它也是今天我们在推文介绍工具背后支持的模块之一. 2 Vaex Vaex是 一种更快.更安全.总体上更方便的方法,可以使 ...

  7. javascript作用域、预解析笔记

    1.作用域     一般情况下,一段代码中所用到的名字并不总是有效可用的,     而限定这个名字(变量)的可用性的代码范围就是这个名字的作用域,可用有效的减少变量名冲突     2.js的作用域(e ...

  8. 谈下APP测试和WEB测试的区别

    先来讲下相同点: 1.都需要理论知识,相同的用例设计方法:边界值,等价类,错误推导法,场景法 2.同样的测试方法 验证功能是否满足需求 3.都需要检查UI  界面设计是否合理 4.性能检测  并发 吞 ...

  9. LibSvm流程及java代码测试

    使用libSvm实现文本分类的基本过程,此文参考 使用libsvm实现文本分类 对前期数据准备及后续的分类测试进行了验证,同时对文中作者的分词组件修改成hanLP分词,对数字进行过滤,仅保留长度大于1 ...

  10. 2020-05-21:es底层读写原理?倒排索引原理?

    福哥答案2020-05-21: es不熟悉,答案仅供参考:es写数据过程1.客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点)2.coordinatin ...