在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. Python元组索引、截取

    Python元组索引.截取: 索引下标: tuple_1 = ('a','b','c','d','e','f','g','h') print(tuple_1[0]) # a print(tuple_1 ...

  2. PDOStatement::setAttribute

    PDOStatement::setAttribute — 设置一个语句属性(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)高佣联盟 www.cgewang.com 说 ...

  3. Canvas知识点补充

    Canvas笔记 复习 初识canvas <canvas> 是 HTML5 新增的,一个可以使用脚本(通常为 JavaScript) 在其中绘制图像的 HTML 元素.它可以用来制作照片集 ...

  4. 学习使用CompletableFuture

    CompletableFuture 一.前言 1.JDK5的异步处理方式 2.JDK8的异步处理方式 二.学习CompletableFuture 1.结果获取方式 2.创建CompletableFut ...

  5. Docker这些none:none的镜像,难道就不配拥有名字吗

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! 搞容器开发一段时间后,想看看都有哪些镜像,执行了一下docker images -a,蒙圈了,有一堆<none> ...

  6. SpringBoot之多模块项目

    SpringBoot之多模块项目 说明:我们通过maven的父子工程来搭建springboot的多模块项目** 项目的整体结构 本项目涉及了到了五个模块 framework-web模块主要是放置前端的 ...

  7. 吴太银:华为消费者云服务Cassandra使用场景与最佳实践

    大家好,我是华为消费者云的吴太银. 我今天分享的主要是华为消费者云服务使用Cassandra的应用场景和最佳实践.我这个可能跟其他嘉宾分享的不太一样,因为前几个嘉宾讲的实际上对Cassandra原生的 ...

  8. 3行!仅3行代码就能抓取B站(弹幕、评论、用户)数据

    今天介绍一个获取B站数据的Python扩展库-bilibili_api 可以获取的数据包括: video-视频模块 user-用户模块 dynamic-动态模块 这次用“Running Man”十周年 ...

  9. Json字符串与QVariantList 对象相互转换

    在Qt中QVariantList 使用起来很方便,如果涉及到数据的传输,需要将QVariantList 数据转换为JsonArray字符串,这个转换Qt已经实现好了,只需要调用接口就可以完成转换,代码 ...

  10. 移动端与Web端疫情数据展示

    1.题目要求 2.整体思想 首先是在前两阶段已经完成的echarts可视化.利用Jsoup爬取疫情数据基础上来进行调用与完善.大致思想是在Android Studio上完成交互去调用ecplise中的 ...