如何查找每個分組的前三條記錄

在此之前,我們首先要了解一下幾個常用的命令和區別

  • having與where
    區別在於執行時機不同,where是在檢索開始時從數據源中獲取,having是從分組後的數據結果中獲取。
    所以,重點在於having所篩選的數據一定是在where刪選之後!
    這個having說白了就是爲了配合統計函數使用的

  • exist的總結
    這個子查詢的目的不在於爲了產生結果集,只是用來判斷某個子查詢是否查詢到了數據,返回的是一個布爾值。

  • count()統計函數
    count()求某個組內非NULL記錄的值,而count(*)可以求出某個組內含null記錄的值。
    下面建表試驗一下。

CREATE TABLE `table1` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) NOT NULL DEFAULT '',
 `Gender` tinyint(4) NOT NULL COMMENT '0爲男,1爲女',
 `score` int(11) NOT NULL,
 `class` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

在這裏插入圖片描述
目的求出這個班中男女生中的前兩名。

SELECT *FROM table1 a 
where EXISTS (SELECT COUNT(*) FROM table1 b WHERE b.score>=a.score 
GROUP BY b.gender	HAVING COUNT(*)<=2 ) ORDER BY Gender,score DESC 

得出結果是這樣的
在這裏插入圖片描述
分析一下這個結構,在where exists 後的子查詢的意思是,按性別分組之後,這個表中比這個學生分數還高的人數少於兩個的查出來,之所以能夠顯示分組之後的人數,私以爲這就是形成一個循環,只要滿足條件,就接着輸出。類似這種條件均可以如此解決。這裏面有個大坑,回頭問問大神看看是什麼情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章