在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. Django学习路35_视图使用方法(复制的代码) + 简单总结

    from django.shortcuts import render,redirect from django.http import HttpResponse,JsonResponse from ...

  2. Blob分析之bottle.hdev

    * 分割读取啤酒瓶子上的数字* bottle.hdev: Segment and read numbers on a beer bottle* 第0步* Step 0: Preparations*定义 ...

  3. CF R 632 div2 1333D Challenges in school №41

    LINK:Challenges in school №41 考试的时候读错题了+代码UB了 所以wa到自闭 然后放弃治疗. 赛后发现UB的原因是 scanf读int类型的时候 宏定义里面是lld的类型 ...

  4. bzoj 1738 [Usaco2005 mar]Ombrophobic Bovines 发抖的牛 最大流+二分

    题目要求所有牛都去避雨的最长时间最小. 显然需要二分 二分之后考虑如何判定. 显然每头牛都可以去某个地方 但是前提是最短路径<=mid. 依靠二分出来的东西建图.可以发现这是一个匹配问题 din ...

  5. BZOJ3772精神污染&BZOJ3488&luogu3242接水果

    LINK1:精神污染 LINK2:[ONTAK2010Highways](http://www.lydsy.com/JudgeOnline/problem.php?id=3488) LINK3:[接水 ...

  6. 三个技巧帮助Docker镜像瘦身

    在构建Docker容器时,应该尽量想办法获得体积更小的镜像,因为传输和部署体积较小的镜像速度更快. 但RUN语句总是会创建一个新层,而且在生成镜像之前还需要使用很多中间文件,在这种情况下,该如何获得体 ...

  7. 基于IDEA 代码提交Git

    基于IDEA 代码提交Git 步骤 1 创建一个项目 2 点击 VCS --> Import init Version Control --> Create Git Repository ...

  8. 实验11——java线程模拟卖票

    package cn.tedu.demo; /** * @author 赵瑞鑫 E-mail:1922250303@qq.com * @version 1.0 * @创建时间:2020年7月31日 下 ...

  9. 001_centos7配置网络动态获取IP地址

    笔者今天刚装完centos7的虚拟机,发现无法获取IP地址,经过网上查询资料,发现centos7是默认没有网络配置的,需要手工配置. 而centos7与centos6不同,没有了config命令,所以 ...

  10. Python的10个神奇的技巧

    尽管从表面上看,Python似乎是任何人都可以学习的一种简单语言,但确实如此,许多人可能惊讶地知道一个人可以熟练掌握该语言. Python是其中的一门很容易学习的东西,但可能很难掌握. 在Python ...