在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 |
+ ----+------+-------+-------+ |
方法一
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 |
+ ----+------+-------+-------+ |
方法二
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 |
+ ----+------+-------+-------+ |
這裏列出了多種SQL語句的實現方法,有些是MySQL特有的(Limit, 其它數據庫可根據實際更改,好比oracle的rownum,MS SQL SERVER 的 top,..),有時是SQL標準支持的。但效率上和應用的場合或許不一樣。具體應用時可根據實際表中的記錄狀況,索引狀況進行選擇。oracle
轉至(http://www.nowamagic.net/librarys/veda/detail/1910)測試