(轉)查詢分組後每一個分組的前幾條記錄

在MySQL使用中,常常須要查詢每一個分組的前幾條記錄(查詢分組後每個組的前幾項),下面寫了個簡單的例子說明下SQL的寫法。簡單的表設計以下,要求每一個班總分排名最前的前兩條數據。mysql

測試表語句以下:sql

1 create table test(id int unsigned not null auto_increment primary key,name varchar(10),class varchar(20),score varchar(20));
2 insert into test(name, class, score) values ('gonn', '6(1)', '299');
3 insert into test(name, class, score) values ('yyun', '6(1)', '259');
4 insert into test(name, class, score) values ('lin', '6(1)', '289');
5 insert into test(name, class, score) values ('mei', '6(1)', '277');
6 insert into test(name, class, score) values ('xj', '6(2)', '287');
7 insert into test(name, class, score) values ('zhl', '6(2)', '277');
8 insert into test(name, class, score) values ('lwjs', '6(2)', '257');
9 insert into test(name, class, score) values ('lulu', '6(2)', '265');

運行以上SQL,獲得的表結構以下:數據庫

01 mysql> SELECT * FROM test;
02 +----+------+-------+-------+
03 | id | name | class | score |
04 +----+------+-------+-------+
05 |  1 | gonn | 6(1)  | 299   |
06 |  2 | yyun | 6(1)  | 259   |
07 |  3 | lin  | 6(1)  | 289   |
08 |  4 | mei  | 6(1)  | 277   |
09 |  5 | xj   | 6(2)  | 287   |
10 |  6 | zhl  | 6(2)  | 277   |
11 |  7 | lwjs | 6(2)  | 257   |
12 |  8 | lulu | 6(2)  | 265   |
13 +----+------+-------+-------+
14 8 rows in set

方法一

01 mysql> SELECT a.id,a.name,a.class,a.score
02 FROM test a LEFT JOIN test b on a.class = b.class and a.score < b.score
03 GROUP BY a.id,a.name,a.class,a.score
04 HAVING count(b.id) < 2
05 ORDER BY a.class,a.score DESC;
06 +----+------+-------+-------+
07 | id | name | class | score |
08 +----+------+-------+-------+
09 |  1 | gonn | 6(1)  | 299   |
10 |  3 | lin  | 6(1)  | 289   |
11 |  5 | xj   | 6(2)  | 287   |
12 |  6 | zhl  | 6(2)  | 277   |
13 +----+------+-------+-------+
14 4 rows in set

方法二

01 mysql> SELECT * FROM test a
02 WHERE 2 >(SELECT count(*) FROM test WHERE class = a.class and score>a.score)
03 ORDER BY a.class,a.score DESC;
04 +----+------+-------+-------+
05 | id | name | class | score |
06 +----+------+-------+-------+
07 |  1 | gonn | 6(1)  | 299   |
08 |  3 | lin  | 6(1)  | 289   |
09 |  5 | xj   | 6(2)  | 287   |
10 |  6 | zhl  | 6(2)  | 277   |
11 +----+------+-------+-------+
12 4 rows in set

這裏列出了多種SQL語句的實現方法,有些是MySQL特有的(Limit, 其它數據庫可根據實際更改,好比oracle的rownum,MS SQL SERVER 的 top,..),有時是SQL標準支持的。但效率上和應用的場合或許不一樣。具體應用時可根據實際表中的記錄狀況,索引狀況進行選擇。oracle

轉至(http://www.nowamagic.net/librarys/veda/detail/1910)測試

相關文章
相關標籤/搜索