news 2026/10/12 3:20:46

mysql获取分组中的指定数据(附四大排序函数说明)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
mysql获取分组中的指定数据(附四大排序函数说明)

目录

  • 一.背景
  • 二.解决方案
    • 1.先排序后分组方式
    • 2.利用rank() over...(推荐)
    • 3 mysql四大排名函数
      • (1)排序条件下的排名
      • (2)分区排序条件下的排名

一.背景

:
举个例子,现有两张表分别是老师和学生,一个老师有多个学生,学生表内有老师ID做关联。

查询所有老师及对应的学生信息:

现在需求是查询每个老师及其手下分数最高的学生信息,我们应该如何书写语句呢?几种实现方式我们逐一演示

二.解决方案

1.先排序后分组方式


直接运行,结果报错。不要慌,出错原因是mysql版本问题,mysql5.7之后的版本为了语法的严谨(据说是为了对标Oracle)默认开启了only_full_group_by,顾名思义就是只支持分组覆盖查询,听着有点懵?索引覆盖听说过吧?这里和覆盖索引类似,就是查询的字段要和分组的字段相同,也就是只能select 分组字段或者聚合函数。


怎么解决呢?推荐一劳永逸的方式,修改配置文件:

sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

以上设置对新建数据(全局)生效,对于已经存在的数据,要在对应库表中执行:

setsql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'



降序排序后分组结果仍然不正确,我们对语句进行分解。首先执行排序语句

因为在子查询排序后再进行分组查询时,系统调用查询优化器,放弃了子查询的排序改用默认的按ID排序,这个过程可以手动演示:




这时我们可以在子查询语句中的排序后加上Limit,做出限制。系统查询优化器识别到子查询中的在保留limit的同时也保留了子查询的排序规则。

SELECT*FROM(SELECT*fromstudentORDERBYscoredesclimit1000)asttGROUPBYteacherId;




最终语句:

WITHstas(SELECT*FROM(SELECT*fromstudentORDERBYscoredesclimit1000)asttGROUPBYteacherId)SELECTt.*,st.*fromteacher tleftJOINstont.id=st.teacherId;

2.利用rank() over…(推荐)


WITHstas(select*,RANK()over(PARTITIONbyteacherIdORDERBYscoreDESC)as组内分数排名FROMstudent)SELECTt.*,st.*fromteacher tleftJOINstont.id=st.teacherIdWHERE组内分数排名=1;

3 mysql四大排名函数

四大排名函数分别是:RANK()、DENSE_RANK()、ROW_NUMBER()、NTILE(N)。以下是同时使用的效果,我们从中可以看出差异

(1)排序条件下的排名

(2)分区排序条件下的排名

PARTITION BY用来分区,与GROUP BY类似,但是分区不像分组会对结果进行汇总,说通俗点,分组是将数据分组后返回将每组中的一条数据作为代表返回,而分区是全部返回。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/12 3:20:42

CubeFS 中的 HttpRouter 深入解析:Go 高性能 HTTP 路由器的原理与实战

存储分布式文件系统对象存储云原生 【免费下载链接】cubefs cloud-native distributed storage 项目地址: https://gitcode.com/gh_mirrors/cu/cubefs 点击查看 免费下载 HttpRouter 是一个基于压缩字典树(Radix Tree)实现的高性能 Go HTTP …

作者头像 李华
网站建设 2026/10/12 3:20:31

无线路由器当无线AP用:网线插LAN口,手把手配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/12 3:20:22

STM32寄存器白话手册:从硬件信号流理解GPIO、时钟与中断

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/12 3:19:41

WiFi分析工具设计实战:从数据采集到信道优化与故障排查

1. 从一个标题说起:这个工具到底在解决什么问题第一次看到“Jev powered WiFi analysis tool”这个标题,我的直觉是:这大概率是一个把无线网络分析能力封装成轻量级工具的项目,名字里的“Jev”可能是作者自定的代号、模块名或者某…

作者头像 李华
网站建设 2026/10/12 3:15:58

Open-Code-Review:一种结构化、可追溯、知识沉淀型代码评审范式

1. 项目概述:这不是代码检查,而是一场协作范式的重构“open-code-review”这个词组乍看像一个工具名,实则是一套正在快速落地的工程实践方法论——它把传统封闭、单向、高门槛的代码评审(Code Review),彻底…

作者头像 李华