欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

mysql 每組 topn

林國瑞2年前8瀏覽0評論

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的學生。這個方法比較簡單,實現方式也容易理解,但如果數據量很大時效率可能不高。如果需要更高效的方法可以考慮使用窗口函數實現。