MySQL是一種廣泛使用的關系型數據庫管理系統。在日常使用MySQL過程中,我們經常會遇到需要對某一組數據進行topn排序的情況。下面我們來介紹如何使用MySQL實現每組topn。
-- 假設我們需要對score表中每個class的分數取前3名 -- 創建測試數據表score CREATE TABLE IF NOT EXISTS score ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主鍵id', name VARCHAR(20) NOT NULL COMMENT '姓名', class VARCHAR(10) NOT NULL COMMENT '班級', score INT NOT NULL COMMENT '分數' ) ENGINE = INNODB AUTO_INCREMENT = 1 COMMENT='成績表'; -- 插入測試數據 INSERT INTO score(name,class,score) VALUES('張三','一班',80); INSERT INTO score(name,class,score) VALUES('李四','一班',90); INSERT INTO score(name,class,score) VALUES('王五','二班',85); INSERT INTO score(name,class,score) VALUES('趙六','二班',95); INSERT INTO score(name,class,score) VALUES('小七','三班',75); INSERT INTO score(name,class,score) VALUES('小八','三班',95); INSERT INTO score(name,class,score) VALUES('小九','三班',80); -- 使用子查詢實現每組topn SELECT s1.* FROM score s1 WHERE ( SELECT COUNT(DISTINCT(s2.score)) FROM score s2 WHERE s2.score >= s1.score AND s1.class = s2.class )<= 3 ORDER BY s1.class ASC, s1.score DESC; -- 結果如下 id name class score 2 李四 一班 90 1 張三 一班 80 4 趙六 二班 95 3 王五 二班 85 6 小八 三班 95 7 小九 三班 80
上面的代碼使用子查詢實現了每組topn排序,即對于每個class,找出分數排名前3的學生。這個方法比較簡單,實現方式也容易理解,但如果數據量很大時效率可能不高。如果需要更高效的方法可以考慮使用窗口函數實現。
上一篇mysql復合索引降序
下一篇mysql 每組中前三名