/*思路** 題目:如何解決取一個班成績中前N名? 求前N名給我的第一個感覺 我想到了 sqlserver中 Top 函數 但是MySQL中并沒有這個函數。 我們先按成績排序,再找到 第N名在哪兒個位置,直接用limit N 便可以求出 那我們如果確認第N名的位置呢? 很簡單,我們按成績降序排序并分組(因為有并列情況) 生成中間表 記為 B表 此時 我們要求前 N 名 我們就取出 B表 前N條記錄 然后求個數的和。 這個和 即為 第N名的最后一個(第N名可能存在并列情況) ****/**
create PRocedure findTop3(IN topN int)begindeclare limitLen int default 0; select sum(E.b) into limitLen from( select B.* from( select count(*) as b from score group by marks order by marks desc ) as B limit topN )as E ;select * from score order by marks desc limit limitLen;end/**********測試數據********************* score 表: mysql> select *from score; +—-+——-+ | id | marks | +—-+——-+ | 1 | 99 | | 2 | 99 | | 3 | 100 | | 4 | 99 | | 5 | 68 | | 6 | 89 | | 7 | 90 | +—-+——-+
score 表結構: +——-+———+——+—–+———+—————-+ | Field | Type | Null | Key | Default | Extra | +——-+———+——+—–+———+—————-+ | id | int(11) | NO | PRI | NULL | auto_increment | | marks | int(11) | YES | | NULL | | +——-+———+——+—–+———+—————-+
測試結果: (1)mysql> call findTop3(3); +—-+——-+ | id | marks | +—-+——-+ | 3 | 100 | | 1 | 99 | | 2 | 99 | | 4 | 99 | | 7 | 90 | +—-+——-+ (2)mysql> call findTop3(5); +—-+——-+ | id | marks | +—-+——-+ | 3 | 100 | | 1 | 99 | | 2 | 99 | | 4 | 99 | | 7 | 90 | | 6 | 89 | | 5 | 68 | +—-+——-+
**************************************************/
新聞熱點
疑難解答