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.pswp.cn/news/273149.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273149.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273149.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Oracle 跨庫 查詢 復制表數據 分布式查詢

方法一: 在眼下絕大部分數據庫有分布式查詢的須要。以下簡單的介紹怎樣在oracle中配置實現跨庫訪問。比方如今有2個數據庫服務器,安裝了2個數據庫。數據庫server A和B。如今來實如今A庫中訪問B的數據庫。 第一步、配置Aserver端的tnsnames.ora文件&#…

java 匹配mysql按鈕_使用Java在mysql查詢中設置匹配函數

我有以下在java中查詢(mysql)的摘錄:queryGeral.append("FROM product p, fabricante_product fp, fabricante f, extensao e, product_autor pa ").append(" WHERE ").append("a.nome like ? AND ").append("p.cod_material …

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為了走在科技…

Kafka架構設計:分布式發布訂閱消息系統

【http://www.oschina.net/translate/kafka-design】&#xff08;較長&#xff1a;很詳細的講解&#xff09; 【我們為什么要搭建該系統】用作LinkedIn的活動流&#xff08;activity stream&#xff09;和運營數據處理管道&#xff08;pipeline&#xff09;的基礎。作為多種類型…

拼團php開發邏輯思維羅振宇_2019羅胖羅振宇跨年演講手動整理稿,看了兩遍

2019羅胖羅振宇跨年演講看了兩遍&#xff0c;手動整理文檔1.歲月不饒人&#xff0c;我們也沒饒了歲月2.你有你的計劃&#xff0c;原來這個世界另有計劃&#xff0c;既然這個世界另有計劃&#xff0c;我們就得重做計劃3.做事的人和不做事的人4.宏觀是我們必須忍受的&#xff0c;…

URLConnection

轉載&#xff08;http://www.cnblogs.com/shyang--TechBlogs/archive/2011/03/21/1990525.html&#xff09; 關于URLConnection&#xff0c;網上很多回答都是對API的翻譯&#xff0c;很崩潰&#xff0c;我是看了很多之后&#xff0c;然后看API才發現的。此后我會吸取教訓&#…

java文件拷貝_Java實現文件拷貝的4種方法

第一種方法:古老的方式public static long forJava(File f1,File f2) throws Exception{long timenew Date().getTime();int length2097152;FileInputStream innew FileInputStream(f1);FileOutputStream outnew FileOutputStream(f2);byte[] buffernew byte[length];while(tru…

今夜的硬件之旅

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…

有1~5000一組亂序數列,請使用偽代碼對該數進行排列

先把1-5000組成一個數組 冒泡排序法 $arrarray(1,2,3,4,5,6,7,8,9.....5000); $totalcount($arr); For($i0;$i<$total;$i){ For($j0;$j<$total-1;$j){ If($arr[$j]>$arr[$j1]){ $tmp$arr[$i]; $arr[$j]$arr[$j1]; $arr[$j1]$tmp; } } } 快速排序法 $arrarray(1,2,3,4,…

java 類型轉換方法_java數據類型轉換的常見方法

public class Testfun {public static void main(String[] args) {// (一)跨Number父類的類型轉換// 1、str轉int > Integer.parseInt(s1)String s1 "19";int i2 Integer.parseInt(s1);// 數字str轉化為對標的intSystem.out.println("i2" (i2));// 2…

json to java 在線_Json轉Java對象 (全網最簡版)

Json2Java(全網最簡版)json字符串轉Java對象,生成對應文件描述&特點簡易的Json轉Java工具,滿足基本日常使用(特殊需求可自行增添,代碼就一頁)在網上找了好些個這類工具,不是只暴露iead插件就是復雜&沒文檔,于是自己寫了個全網最簡版Json2Javaonly one file用法public c…

Material design 色彩

八月已過去&#xff0c;九月剛來到~暑假已過去~九月上學季~~又迎來了一個桂花飄香的季節&#xff0c;你是否有了新的目標和計劃~~所以在九月初始給大家帶來一個全新的東西&#xff08;ps&#xff1a;對于我來說是全新的東西&#xff09;——Material Design~~九月讓我們一起好好…

java logging api_Java Logging API - Tutorial

1.2. 創建一個logger包 java.util.logging提供了日志的功能&#xff0c;可以使用類似于下面的代碼來創建一個logger&#xff1a;import java.util.logging.Logger;private final static Logger LOGGER Logger.getLogger(MyClass.class .getName());1.3. LevelLog的等級反映了問…