mysql将多个成绩放在一排_mysql巧用连表查询各科成绩前三名

下列是各表的详情,不想自己建表的同学可以直接copy code,数据随意。

创建表成绩详情表:

CREATE TABLE score (

id int(10) NOT NULL AUTO_INCREMENT,

subject_id int(10) DEFAULT NULL,

student_id int(10) DEFAULT NULL,

score float DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;

acdd18625094a87744e96284141ddc06.png

创建学生表:

CREATE TABLE student (

id int(10) NOT NULL AUTO_INCREMENT,

name varchar(10) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

12fab718f3cebfb13370d56ea0e1e8ac.png

创建科目表:

CREATE TABLE subject (

id int(10) NOT NULL AUTO_INCREMENT,

name varchar(10) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

3c55591ccabd11073543f9437bf0dd94.png

查询语句:

select a.id,a.subject_id,a.student_id,a.score from score as a left join score as b on a.subject_id=b.subject_id and a.score>=b.score

group by a.subject_id,a.student_id,a.score

having count(a.subject_id)>=4

order by a.subject_id,a.score desc;

分析:先将查询语句分别拆开来一步一步分析

select a.id,a.subject_id,a.student_id,a.score,b.id,b.subject_id,b.student_id,b.score

from score as a left join score as b on a.subject_id=b.subject_id;

#这里把所有的列都列出来了便于对比

这里把表score的每一条同subject_id的数据都连接起来,形成笛卡尔积,如图所示:共18*6=108条数据

30e80ab8721abf29d088a6f51746e669.png

现在我们可以再进一步处理上面的数据了。这里我们再加上 a.score>=b.score 这个条件筛选再进行一次筛选。

select a.id,a.subject_id,a.student_id,a.score,b.id,b.subject_id,b.student_id,b.score

from score as a left join score as b on a.subject_id=b.subject_id and a.score>=b.score;

a.score>=b.score 这里是在同一门课程中,将每一个分数与其他分数(包括自己)进行一一对比,只留下大于自己,或者等于自己的分数。

如果选择对比的行中的a.score是最高分,那么在后面利用group by a.subject_id,a.student_id,a.score分组的时候,此时计算得出的count(a.subject_id)就是最多的(count为总人数),因为其它的分数最多也只是和它一样多,其它的都比它低;同理,如果a.score是最低分,那么count(a.subject_id)是最少的(count最少为1,只有它自己,其余分数都比它高;最多为总人数,这种情况是其它人的分数都和最低分一样多...),其它的分数最差也和它一样多,其它的都比它要高。例如:

100分是最高的,所以几乎其他所有分数都符合100>=其他分数 这个条件,所以100分出现次数最多(count为总人数)

0分,是最低分,几乎其他所有分数都不符合0>=其他分数这个条件,所以0分出现的次数应该是最少的(count最少为1;最多为总人数,此时其他的分数也都是最低分,即大家分数一样低)

有同学可能会问为什么不用a.score > b.score来筛选。如果用a.score > b.score来进行筛选的话,如果数据中某个科目出现大量的并列第一名的话那么第一名就会被过滤掉,以至于得不到结果。如图:

69a2b3dc029f5f85226b98a7a113cc66.png

接下来就是分组:group by a.subject_id,a.student_id,a.score #按subject_id,student_id,score来进行分组

(这里使用group by a.subject_id,a.student_id,a.score和使用group by a.subject_id,a.student_id一样的,因为两表左连接之后,不可能出现相同的a.subject_id,a.student_id有多条不同的a.score的记录;因为同一个同学a.student_id,同一个科目a.subject_id,只能有一个分数a.score,一个同学不可能一个科目有多个不同的分数);

select a.id,a.subject_id,a.student_id,a.score,b.id,b.subject_id,b.student_id

b.score,count(a.subject_id) from score as a left join score as b

on a.subject_id=b.subject_id and a.score>=b.score group by a.subject_id,a.student_id,a.score;

添加count(a.subject_id)来进行对比易于理解

e39e5f73ece0ab992857f6019d9c569b.png

分组后再进行条件查询:having count(a.subject_id)>=4;

下面来讨论下>=4是什么含义:正常来说,如果每门课程的各个同学的分数都不一样,那么同一门课程中从最高分到最低分的count(a.subject_id) 分别为:6,5,4,3,2,1;取count>=4就是取6,5,4即取count最多的三个,所以取出的数据就是排名前三(count从高到低,取前三,那么就是前三甲的记录):

接下来就是排序:order by a.subject_id,a.score desc。

ede6ee4966afe19b77b0688357fd7d9a.png

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

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

相关文章

LeetCode Contains Duplicate (判断重复元素)

题意&#xff1a; 如果所给序列的元素不是唯一的&#xff0c;则返回true&#xff0c;否则false。 思路&#xff1a; 哈希map解决。 1 class Solution {2 public:3 bool containsDuplicate(vector<int>& nums) {4 unordered_map<int,int> mapp;5 …

提高团队代码质量

近期看到一篇博客。大致的意思就是网管将原本混乱不堪的交换机整理整齐了&#xff0c;起初交换机是图2那样的&#xff0c;由于越来用的人越多&#xff0c;操作的人越来越多。终于成为了图1那个样子。这不禁让我想到了项目中的代码。原先在刚上线的时候谈不上是完美的&#xff0…

webrender 查看是否开启_想要体验极致顺滑的网页加载体验?手动开启Firefox WebRender渲染引擎...

昨天我们提到火狐浏览器最新稳定版Mozilla Firefox v67 版将面向部分用户开启WebRender渲染引擎测试。据火狐浏览器团队介绍当用户开启新的渲染引擎后 , 网页加载帧率能够从现有的 20FPS 直接提升到 60FPS。不过新的渲染引擎本身并不是用于加快网页的加载速度&#xff0c;而是…

NOIP201307货车运输

试题描述A 国有n座城市&#xff0c;编号从1到n&#xff0c;城市之间有m条双向道路。每一条道路对车辆都有重量限制&#xff0c;简称限重。现在有q辆货车在运输货物&#xff0c;司机们想知道每辆车在不超过车辆限重的情况下&#xff0c;最多能运多重的货物。输入第一行有两个用一…

knime如何连接mysql_knime怎么连接MySQL?

首先判断一下网络是否通&#xff1a;如果在局域网相同网段内那网络是通的&#xff0c;不同网段间需要看是否有做隔离&#xff0c;如果没有隔离&#xff0c;那就也是通的。测试方法可以用telnet 数据库IP 数据库端口号的方式探测一下 例如 telnet 192.168. 1.124 3306创建用户&a…

Asp.net Vnext IValueProvider

概述 本文已经同步到《Asp.net Vnext 系列教程 》中] IValueProvider 根据ValueProvider获取数据&#xff0c;在对数据进行绑定 代码实现 private class CustomValueProvider : IValueProvider{//判断否具有指定的前缀public Task<bool> ContainsPrefixAsync(string pref…

ECNUOJ 2615 会议安排

会议安排 Time Limit:1000MS Memory Limit:65536KBTotal Submit:451 Accepted:102 Description 科研人员与相关领域的国内外同行进行适时的接触与充分的交流&#xff0c;对于促进提高他们的科研业务水平&#xff0c;并及时掌握科研动态是十分必要而且重要的。ECNU为了走在科技…

拼团php开发逻辑思维罗振宇_2019罗胖罗振宇跨年演讲手动整理稿,看了两遍

2019罗胖罗振宇跨年演讲看了两遍&#xff0c;手动整理文档1.岁月不饶人&#xff0c;我们也没饶了岁月2.你有你的计划&#xff0c;原来这个世界另有计划&#xff0c;既然这个世界另有计划&#xff0c;我们就得重做计划3.做事的人和不做事的人4.宏观是我们必须忍受的&#xff0c;…

今夜的硬件之旅

6脚继电器&#xff1a; 汇科继电器HK4100F-DC6V-SHG ①3A触点切换能力 ②具有一组常开&#xff0c;一组转换触点形式 ③超小型&#xff0c;标准印刷制版引出脚 ④有塑封型 Outline&#xff08;L*W*H&#xff09;外形尺寸&#xff1a;15.510.511.8 Contact Date触电形式&#…

mp3 pcm java_Java mp3文件转pcm文件

Java mp3文件转pcm文件package cn.zpy.util;import java.io.File;import java.io.IOException;import javax.sound.sampled.AudioFileFormat;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;imp…

Material design 色彩

八月已过去&#xff0c;九月刚来到~暑假已过去~九月上学季~~又迎来了一个桂花飘香的季节&#xff0c;你是否有了新的目标和计划~~所以在九月初始给大家带来一个全新的东西&#xff08;ps&#xff1a;对于我来说是全新的东西&#xff09;——Material Design~~九月让我们一起好好…

内存查看工具RAMMAP说明

参考 Technet Process Private: 分配给单一Process专用的内存 Mapped File: 用来储放档案内容快取(Cache)的内存空间 Shared Memory: 标注给多个Process共用的内存分页(Page&#xff0c;内存管理单位) Page Table: 用来描述虚拟内存位址的分页表(裡面是一笔一笔的PTE&…

php接口和java接口_java和php接口的区别是什么

java和php接口的区别是&#xff1a;1、php接口中的抽象方法只能是public的&#xff0c;默认也是public权限&#xff1b;2、java中私有方法使用private修饰&#xff0c;供接口中的默认方法或者静态方法调用。【相关学习推荐&#xff1a;php编程(视频)】php:规范&#xff1a;接口…

java hql多条件查询_使用hql语句怎样实现多条件查询

展开全部这里只写了DAO和业务62616964757a686964616fe59b9ee7ad9431333264623331逻辑组件、ACTION的具体实现类&#xff0c;PO和和接口自己应该会写吧&#xff0c;HQL采用的是结合SQL的那种写法&#xff0c;增删改查全在里面了&#xff0c;修改下马上就能跑了&#xff0c;不清楚…

闪回数据库

Flashbacking a database means going back to a previous database state.闪回数据库到之前数据库的状态The Flashback Database feature provides a way to quickly revert entire Oracle database to the state it was in at a past point in time. 闪回数据库特性提供了一种…

java.net.unknown_android -------- java.net.UnknownServiceException

最近升级了Android的API版本时 &#xff0c;导致我的网络请求失败了&#xff0c;出现了这个错误 java.net.UnknownServiceException&#xff0c;这个错误&#xff0c;我在网上查到这个主要是由于&#xff0c;我们的OkHttp3会默认使用密文传输&#xff0c;而我们的代码中使用Htt…

Visual Studio下Qt调用IDL

一&#xff0e;简单介绍&#xff1a; 1.ActiveQt包含QAxContainer和QAxServer组件。 1) QAxContainer允许使用COM对象&#xff0c;并且可以将ActiveX控件嵌入到Qt程序中去。 QAxContainer是有三个类组成的。分别是&#xff1a; QAxObject封装了COM对象 QAxWidget封装了ActiveX控…

安装java过程_Java的安装过程

记录一下自己在Windowns下安装java的过程打开网址后要先登录&#xff0c;如果没有号就先注册&#xff0c;然后才能下载step1&#xff1a;下载JDK(1)将鼠标指向download&#xff0c;会出现如下界面:(2)点击左上角PopularDownloads下的 Java for Developers进入如下界面&#xff…

dockerfile源码安装mysql_docker容器详解五: dockerfile实现tomcat环境以及源码安装mysql...

tomcat上一节讲到了dockerfile的基础&#xff0c;这一次咱们来作一个小的练习首先要了解tomcat安装的整个过程首先搭建 jdk环境&#xff1a;下载jdk包&#xff0c;解压以后添加环境变量而后搭建tomcat&#xff1a;下载tomcat包&#xff0c;解压&#xff0c;修改配置文件到一个工…

SQL server 2008数据库的备份与还原、分离(转)

一、SQL数据库的备份&#xff1a; 1、依次打开 开始菜单 → 程序 → Microsoft SQL Server 2008 → SQL Server Management Studio → 数据库&#xff1a;Dsideal_school_db既是我们需要备份的学籍数据库 图&#xff08;1&#xff09; 2、选择要备份的数据库“Dsideal_school_d…