group by和min、max函数一起使用

原始数据

查询每科的最高分数

-- 查询每科最高分数
select stuId,classId,stuName,max(score) from student_score group by classId 

错误的结果

这个显然不是对的,或者说不是我们想要的结果,

我们想要的结果是

原因是什么呢?我们知道使用group by分组时,对于有相同的分组字段行会合并成一行,这个时候,如果查询的字段中有非分组字段非分组字段的数据会读取合并的第一行

解决思路是:

方案一:

先将分组的classId和max(score)查出来,作为临时数据然后连表查询

selecta.stuId,a.classId,a.stuName,a.score
fromstudent_score a
inner join 
(selectclassId ,max(score) as scorefromstudent_scoregroup byclassId) b 
ona.classId = b.classIdand a.score = b.score

这种思路是直接匹配数据

还有另外一种思路是,既然非分组是取第一条,那么我们可以按照min还是max来看是用asc还是desc排序

方案二:

因为这里是找最大分数,非分组数据又是取第一条数据,所以我们应该分数倒序

selectb.stuId,b.classId,b.stuName,b.score
from(selecta.stuId,a.classId,a.stuName,a.scorefromstudent_score aorder byscore desc) b
group byb.classId

这个时候还是有问题, 因为mysql 5.6之后版本对排序的sql解析做了优化,子查询中的排序是会被忽略的,所以上面的order by id desc未起到作用

现在的执行结果是这样的,其实还是错误的

所以我们要加上having 1 = 1 来让排序生效

selectb.stuId,b.classId,b.stuName,b.score
from(selecta.stuId,a.classId,a.stuName,a.scorefromstudent_score ahaving1 = 1order byscore desc) b
group byb.classId

最后也得到了想要的结果

查询之后发现,limit也能阻止子查询order by被优化,所以这样也可以

selectb.stuId,b.classId,b.stuName,b.score
from(selecta.stuId,a.classId,a.stuName,a.scorefromstudent_score aorder byscore desclimit 1000) b
group byb.classId

方案三:

当查询的最大、最小值是唯一的时候,还能够通过这样的来查询

selectb.stuId,b.classId,b.stuName,b.score
from student_score b where score in(selectmax(score)fromstudent_score agroup by classId) 

注意,我这里只是演示,如果求分组后的最大分数,且分数都不相同的时候,是可以用这个的,比如最大Id啥之类的,这个是唯一值,可以使用这种方式。我这里因为70分有相同,所以不是很对。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/549023.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3学习日记 Day1

一、简介 1、简介 Vue3是新的默认版本,拥有更快的速度,更好的语法 二、使用create-vue搭建Vue3项目 1、创建项目 1、介绍 create-vue是Vue官方新的脚手架工具,底层切换为了vite,为开发提供极速响应 2、使用 2.1、确定环境条件 2…

局部路径规划算法 - 人工势场法

人工势场法 参考: (1)人工势场法 (2)人工势场法路径规划算法(APF) 1 算法概述 1.1 算法简介 1986 年 Khatib首先提出人工势场法,并将其应用在机器人避障领域,而现代汽…

数据库SQLServer——插入数据

1.插入数据语法 INSERT INTO table_name(column_list) VALUES (value_list); --简写 INSERT INTO table_name VALUES (value_list);INSERT table_name VALUES (value_list); 2.实例 2.1基本形式(不安全) insert into 学生表01 values(李明,男,1.70) …

如何解决网络中IP地址发生冲突故障?

0、前言 本专栏为个人备考软考嵌入式系统设计师的复习笔记,未经本人许可,请勿转载,如发现本笔记内容的错误还望各位不吝赐教(笔记内容可能有误怕产生错误引导)。 1、个人IP地址冲突解决方案 首先winR,调出…

Feign

Feign 1 Feign介绍2 Feign远程调用2.1 Feign替代RestTemplate2.2 自定义配置2.3 Feign使用优化2.4 最佳实践 总结 1 Feign介绍 Feign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得更加简单。它是Spring Cloud中的一个模块,用于简化对REST服…

【Leetcode-19.删除链表的第N个节点】

题目详情: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出&#xff1…

中国巨型地下中微子实验室准备探究宇宙奥秘

JUNO设施将于今年上线,将有助于确定哪种类型的中微子质量最高 - 这是物理学中最大的谜团之一。 中国江门地下中微子天文台(JUNO)的建设工作。朱诺号希望在2024年底之前探测到中微子。图片来源:Qiu Xinsheng/VCG via Getty 开平区…

SpringBoot ApplicationListener实现发布订阅模式

文章目录 前言一、Spring对JDK的扩展二、快速实现发布订阅模式 前言 发布订阅模式(Publish-Subscribe Pattern)通常又称观察者模式,它被广泛应用于事件驱动架构中。即一个事件的发布,该行为会通过同步或者异步的方式告知给订阅该事件的订阅者。JDK中提供…

SQ—inner join、left join、right join区别

关联表查询常用关键字join 假设现有两张表:subject和score left join 基表:左表 表1左连接表2,以左为主,表示以表1为主,关联上表2的数据,查出来的结果显示左边的所有数据,然后右边显示的是和…

2024全新红娘交友系统定制版源码 | 相亲交友小程序源码 全开源可二开

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 全新红娘交友系统定制版源码 | 相亲交友小程序源码 全开源可二开 定制版红娘交友平台小程序源码,很牛逼的东西,虽然是小程序,但是有700多M大&…

10大漏洞评估和渗透测试工具【附安装包】

1、Netsparker Security Scanner 专为企业设计的强大的漏洞扫描和管理工具,它可以检测和利用 SQL 注入和 XSS 等漏洞。 https://www.netsparker.com/product/ 2、Acunetix Scanner 针对中小型企业的 Web 应用程序漏洞扫描程序,但也可以扩展到更大的组…

zabbix企业微信接入结合海螺问问编写的shell脚本

前言 博客懒得写详细了,视频剪的累死了,看视频就好了 白帽小丑的个人空间-白帽小丑个人主页-哔哩哔哩视频 shell脚本 #!/bin/bash #set -x CorpID"" #我的企业下面的CorpID Secret"" #创建的应用那…