前幾天,某在培訓的朋友問我一個問題:查詢每門功課成績最好的前兩名該怎么寫。
這個問題雖然聽起來挺簡單,但是很有意思,於是我就新建了一張如下的表:
stuNo為學號,stuScore為分數,courseId為課程id。
然后我的思路是把每科分數最高的兩個學生篩選出來,然后再進行處理,但是MySQL子查詢不能包含LIMIT字段,而且這樣寫有點蠢,所以查了查資料找出了一種比較好的寫法,如下:
1 select a1.* from score a1 2 INNER JOIN 3 (select a.courseId,a.stuScore from score a left join score b 4 on a.courseId=b.courseId 5 and a.stuScore<=b.stuScore 6 group by a.courseId,a.stuScore 7 having count(b.stuScore)<=2 8 )b1 9 on a1.courseId=b1.courseId and a1.stuScore=b1.stuScore 10 order by a1.courseId,a1.stuScore desc;
雖然這樣寫有點繁瑣,但是這種寫法是對的,我自己也沒找到更好的寫法,就把答案給了朋友。
然后,第二天,朋友說他們老師的答案是:
1 Select * from score a 2 where (Select count(*) from score b 3 where a.courseId=b.courseId 4 and a.stuScore<=b.stuScore 5 )<=2 6 order by courseId,stuScore desc;
當時看到答案,我心里:卧槽!!!這是什么寫法,為什么where條件判斷了一下select count(*)是否小於等於2就能做到篩選各科數據前幾名 ???
然后,我自己網上找了一下select count(*)寫法相關的資料,沒找到任何答案。。。
然后,我問我們領隊,他找了半天,也沒找到任何答案。。。
然后,我們領隊問我們項目經理,也沒答案。。。
然后,就沒然后了。。。
目前我還在等朋友老師的答案,所以暫時寫到這兒吧。。。雖然不太理解這種寫法,但是這種寫法無疑做到了篩選的功能,而且異常簡潔,所以在這里記錄一下這種寫法。如果大家有理解這種寫法的請賜教,在評論區留言,解除菜鳥的疑惑。