1. 程式人生 > >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;
這裡寫圖片描述
建立學生表:
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;
學生表結構
建立科目表:
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;
科目表結構

查詢語句:

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條資料
left join


現在我們可以再進一步處理上面的資料了。這裡我們再加上 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<b.score來進行篩選的話,如果資料中某個科目出現大量的並列第一名的話那麼第一名就會被過濾掉,以至於得不到結果。如圖:
這裡寫圖片描述

接下來就是分組:group by a.subject_id,a.student_id,a.score #按subject_id,student_id,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)來進行對比易於理解
這裡寫圖片描述
分組後再進行條件查詢:having count(a.subject_id)>=4;
接下來就是排序:order by a.subject_id,a.score desc。
這裡寫圖片描述

相關推薦

mysql查詢各科成績

下列是各表的詳情,不想自己建表的同學可以直接copy code,資料隨意。 建立表成績詳情表: CREATE TABLE score ( id int(10) NOT NULL AUTO_INCREMENT, subject_id int(10

查詢Left Join吧

簡單 不知道 效率 行記錄 我們 主體 left 註意 說明 最近看同事的代碼,SQL連表查詢的時候很多時候用的是Inner Join,而我覺得對我們的業務而言,99.9%都應該使用Left Join(還有0.1%我不知道在哪),我用最簡單的方式來描述這兩者的區別,直接看圖

mysql的單查詢查詢

1,新建表和插入資料 建立表,設定欄位的約束條件 create table employee( id int primary key auto_increment, name varchar(20) not null, sex enum('male','female') no

Mysql查詢習題

練習題 表一 mysql> create database linux50 charset utf8; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database

mysql中各種join查詢總結

通常我們需要連線多個表查詢資料,以獲取想要的結果。 一、連線可以分為三類:   (1) 內連線:join,inner join   (2) 外連線:left join,left outer join,right join,right outer join,union,union all   (3) 交

MySQLsum,case...when...優化統計查詢

最近在做專案,涉及到開發統計報表相關的任務,由於資料量相對較多,之前寫的查詢語句查詢五十萬條資料大概需要十秒左右的樣子,後來經過老大的指點利用sum,case...when...重寫SQL效能一下子提高到一秒鐘就解決了。這裡為了簡潔明瞭的闡述問題和解決的方法,我簡化一下需求模型。 現在資料庫有一

MySQL資料庫的使用方法(查詢、分頁查詢)

資料庫連表查詢 學生表student 老師表teacher 課程表course 選課表student_course 1 按“0001”號課程成績由高到低順序顯示所有學生學號、姓名、成績(二表連線); SELECT   &n

mysql 查詢

現有tablea:                                          

MYSQL一次千萬級查詢優化(一)

概述: 交代一下背景,這算是一次專案經驗吧,屬於公司一個已上線平臺的功能,這算是離職人員挖下的坑,隨著資料越來越多,原本的SQL查詢變得越來越慢,使用者體驗特別差,因此SQL優化任務交到了我手上。 這個SQL查詢關聯兩個資料表,一個是攻擊IP使用者表主

查詢(3)之根據相關條件,查詢另外一個或多個的某字段

兩個 mode object 添加 就會 resultmap control var 多個 1、送檢單位 代理商是從代理商表中取得數據 銷售人員從銷售表中取得數據 說一個簡單的思路: sql語句找到連接兩個表的條件,把另外一個表要用到的字段 寫一個 <re

查詢的簡單方法!!

etl point return rim plist turn public 方法 nbsp 在主表(Appointment)裏面private+副表的對象 private Department(副表) depa; private User(副表) u; 然後source

Linq to SQL 的查詢(轉)

equal query 交集 數據庫 調用 數據 變量 bst log 關於數據庫的查詢中經常需要用到多表的連接查詢,這裏就簡單地展示關於linq的查詢功能。 1、單表的查詢 [csharp] view plain copy var query = from

Mysql(四)-1:單查詢

name 格式 none between 排列 字段 group 員工 tle 一 單表查詢的語法 SELECT 字段1,字段2... FROM 表名 WHERE 條件 GROUP

SQL總結 查詢

表示 自然連接 簡單 put delete title null ros insert 連接查詢包括合並、內連接、外連接和交叉連接,如果涉及多表查詢,了解這些連接的特點很重要。 只有真正了解它們之間的區別,才能正確使用。 1、Union UNION 操作符用於合並兩個或

mysql四-1:單查詢

單表查詢一、單表查詢的語法SELECT 字段1,字段2... FROM 表名 WHERE 條件 GROUP BY field HAVING 篩選 ORDER BY field

mysql四-2:多查詢

多表查詢 mysql 51cto 一、準備表新建表mysql> create table department( id int, name varchar(20) );mysql> create table employee( id int primary k

編程之路:MySql系列之多查詢

所有 連接 進行 查看 bsp 關鍵字 right emp 字段 多表連接查詢 #重點:外鏈接語法 SELECT 字段列表 FROM 表1 INNER|LEFT|RIGHT JOIN 表2 ON 表1.字段 = 表2.字段; 交叉連接:不適用任何匹配條

Sql查詢

teacher rom SQ 學生 全外連接 連接 教師表 tom 重點 1.Union:使用union是組合兩張表,消去表中重復行,兩張表查詢的結果有相同數量的列、列類型相似;UNION ALL,不消除重復行教師表: ID Name 101 Mrs Lee

mysql索引及多查詢

技術分享 類型 主表 nbsp prim group 索引 div AR 註意where,group by ,having,order by, limit 等的順序。 主表是被綁定的表,子表是添加了外鍵了的表,註意,在創建表的時候可以添加外鍵,也可以創建完了以後

在Mybatis中使用查詢的一次實際應用

多表關聯 del 應用 行記錄 全部 業務 val 一定的 att 以前在工作中很少使用多表關聯查詢,對連表查詢的具體作用和使用場景也沒有很直觀的認識,通過這次在項目中的實際應用,對此有了一定的認識,特記錄如下。 關聯表介紹: 分別是屬性表attr_info、屬性值表a