Mysql 如何分组查询取最新的几种方案

这篇具有很好参考价值的文章主要介绍了Mysql 如何分组查询取最新的几种方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.row_number函数 (mysql8以上支持)

示例:

SELECT *
FROM
( SELECT *, row_number ( ) over ( PARTITION BY 分组字段 ORDER BY 排序字段 DESC ) AS rn FROM 表 ) pca
WHERE
pca.rn = 1

解释:
1. rn字段:返回的是分组内的结果排序依次递增
2. 分组字段:进行分组的字段
3. 排序字段:需要取最新逻辑的字段

注意:

row_number函数得到的字段rn不能在表后面直接加where条件过滤,需要用select包装生成临时表pca 再进行取最新过滤
并且该函数只能在mysql8.0版本以上运行,5.7不支持该函数

2.子查询

示例:

SELECT *
FROM
表 a
WHERE
a.排序字段 = ( SELECT max( b.排序字段 ) FROM 表 b WHERE b.分组字段 = a.分组字段 )
GROUP BY
a.分组字段

解释:

  1. 分组字段:进行分组的字段
  2. 排序字段:严格意义上不叫排序字段,可以在当前sql语句中可以认为是在分组后需要找最新值字段

注意:

该子查询性能属于四种方案中最低,不适合大数据量查询使用,

最后GROUP BY分组字段是为了在多个最大值有多个相同数据情况下去重处理 按业务场景可去掉

3.临时表

示例:

创建临时表
CREATE TEMPORARY TABLE tmp_表 as select 分组字段,max(排序字段)as 排序字段 from 表 group by 排序字段;
关联临时表查询
select * from 表 p join tmp_表 tmp on tmp.分组字段= p.分组字段 and tmp.排序字段= p.排序字段

解释:

  1. 分组字段:进行分组的字段

  2. 排序字段:严格意义上不叫排序字段,可以在当前sql语句中可以认为是在分组后需要找最新值字段

注意:

  1. 先查询出最新的结果存入临时表,再进行联表查询,数据量大一点的情况下 可以对创建完的临时表加索引,使整个过程的复杂度趋近f(n)。

4.新增字段标识

从业务层面优化,在表上加一个字段,isnewdata,bit型或者int型就好,每次在表中提交数据时,事务中先将要提交的数据所涉及的id,将历史数据isnewdata=1的更新为0,新提交的数据,isnewdata为1,然后增加一个索引isnewdata,或者如果需要和其他表关联的时候,增加复合索引,性能一下就上来了。

5.使用mysql用户变量提供排序序列号

示例:

SET @rank := 0;
SET @cgroup := NULL;
SELECT
a.*
IF
( @cgroup = a.分组字段, @rank := @rank + 1, @rank := 1 ) AS rank_no,
@cgroup := a.分组字段,
FROM
表 a
ORDER BY
a.分组字段,
a.排序字段 ASC

解释:

分组字段:进行分组的字段

排序字段:分组后排序的字段

@rank :序号计数变量

@cgroup :分组字段暂存变量,用来比较是否进入了下一组数据

运行逻辑:

该sql首先会进行排序,先分组字段,再排序字段,这点很关键,然后根据mysql的service层执行顺序对展示数据进行处理,先进入if函数判断数据是累加还是初始化@rank用户变量(注意首先第一次进来@cgroup为空),然后将分组字段的值赋予@cgroup变量。整个执行过程非常精巧有意思,得细细品味。

注意:

不支持开窗函数的mysql版本可以使用该方式,但是要ORM支持多行SQL代码块才行,还要修改数据库的SQL_MODE,mybatis和JPA都可以,Oracle不行 需要配置。比如mycat这种数据库中间件

总结:

如果业务数据量不大,最多就几万条,用方案1,2,3均可。数据量不超过100万行,方案1和3还能勉强顶住。超过100万行,就要从业务层面去优化了,此时选择方案4是明智的文章来源地址https://www.toymoban.com/news/detail-456875.html

到了这里,关于Mysql 如何分组查询取最新的几种方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 内网安装管家婆软件如何实现外网访问?内网穿透的几种方案教程

    管家婆软件从网络架构上分 两 种版本:web(浏览器http端口)访问的版本和客户端(211固定端口+sqlserver数据库)访问的版本。公司库管经常用仓库登录管家婆 , 一旦需要在公司外 部 登陆访问 管家婆客户端 , 就需要在 异地组网 、 增加专线等 , 需要较 高 的成本投入和技

    2024年02月15日
    浏览(32)
  • MySQL如何查询根据某一条件分组,再查询出每组数据中时间最早或最晚的数据

    最近遇到个需求,需要先根据A条件进行分组,然后查询出每组数据中时间最近的一条数据,立马就写出了sql语句 但是执行了一下,发现不对,子查询中 order by 貌似失效了,查出来的数据并不是要想要的时间最近的数据。 经过我的研究,发现,想要子查询中使用order by生效,

    2024年03月09日
    浏览(34)
  • Java Stream 处理分组后取每组最大&Stream流之list转map、分组取每组第一条&Java 8 Collectors:reducing 示例(List分组取最值)

    有一个需求功能:先按照某一字段分组,再按照另外字段获取最大的那个 先根据appId分组,然后根据versionSort取最大. JDK1.8推出的stream流能极大的简化对集合的操作,让代码更美观,老规矩,直接上代码。 取list中对象的某个属性作为唯一key,对象作为value形成一个map集合,能

    2024年02月16日
    浏览(49)
  • Oracle子查询改写的几种方式

    子查询是嵌套在另一个语句(如SELECT,INSERT,UPDATE或DELETE)中的SELECT语句。 通常,可以在任何使用表达式的地方使用子查询。 比如从以下的病人信息中查询最近一个月住院年龄最大的病人信息 从以上的信息中我们知道病人出生日期BIRTHDATE ,限制取数的时间范围算出年龄 首先我

    2024年02月09日
    浏览(36)
  • 分享SQL重复记录查询的几种方法

      SQL重复记录查询的几种方法,需要的朋友可以参考一下 1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 代码如下: select * from people where peopleId in (select   peopleId from   people group by   peopleId having count (peopleId) 1) 2、删除表中多余的重复记录,重复记录

    2024年02月12日
    浏览(35)
  • Java分页查询的几种实现方法

    最近在做需求的过程中遇到几个需要分页查询的需求,我也对分页有了较深的了解。分页一般分为两种一种是直接在sql中分页,一种是在内存中分页。本文仅针对内存中分页做记录。 第一种    如果是一个查询接口,向接口中传入page,和size(page默认值1,size默认值10)即可

    2024年02月06日
    浏览(75)
  • mysql 分组函数,分组查询

    #1.分组函数 功能:用作统计使用,又称聚合函数,统计函数,组函数 分类: sum :求和,avg 平均值,max最大值,min最小值,count计算个数 特点: sum, avg 一般用于处理数值型 max ,min ,count 可以处理任何类型 是否忽略Null count: MYISAM 存储引擎下,COUNT( ) 的效率高 INNODB 存储引擎下,COUN

    2024年01月25日
    浏览(45)
  • Oracle模糊查询的几种方法【推荐最后一种】

    归纳总结 😁 --废话不多说,直接进入主题: oracle 中的 || 起链接作用,使用“||”字符,连接成 -- %param% 示例: 结果: flowermoringrain 嵌套查询: 示例: 结果:\\\'ABC\\\' MySQL中的模糊查询 like 和 Oracle中的 instr() 函数 有同样的查询效果; 示例: 想了解上述基本原理的 🙋 ,就可以

    2024年02月11日
    浏览(27)
  • 实现延迟队列的几种方案

    方案一:基于SpringTask定时扫描数据库 步骤: 把发布的任务和时间保存到数据库中之后使用定时任务SpringTask来进行每五分钟执行一次 优点:可以把任务持久化保存到数据库中,不容易丢失任务 缺点:这种方案发布的时间可能会有误差,因为五分钟才执行一次,如果缩短时间

    2024年02月13日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包