本文作者:心月

mysql實現分組查詢取每組前幾的記錄思路解析

心月IT博客 2019-04-24
摘要:我們不妨換一種思路,我們可不可以對比成績,拿班級里一個學生的成績和班級里其他學生成績對比,然后統計出分數比他高的人數,最后只需通過這個統計的人數來獲取班級前2的學生信息記錄。

    昨天在群里看到群里有人在討論一個分組查詢的問題,這個問題的大概意思是:在一張表里有班級、成績、學生姓名、id,現在要求獲取每個班級里成績前2的學生信息。>初看,這個問題其實很簡單,把每個班級的成績按降序排序,然后取出排序前2的學生就可以了。


    確實,如果單從思維層來說確實可以這么做,但現在這些數據是在數據表中,現在的要求是通過 mysql 查詢語句來實現,要怎么做呢?


    在這張表中有好幾個班級,所以你有可能首先想到的是group by分組,但group by分組后取出來的數據只有一條,因此肯定不能用group by。


    我們不妨換一種思路,我們可不可以對比成績,拿班級里一個學生的成績和班級里其他學生成績對比,然后統計出分數比他高的人數,最后只需通過這個統計的人數來獲取班級前2的學生信息記錄。

下面用實例來具體說明:

數據表信息:(表明:grade)

數據表信息

根據上面的邏輯整理后的信息表:

信息整理表

    通過上面兩張表可以看出,如果想要獲取每個班級前2的學習記錄,只需查詢成績比他高的人數小于2的學生就可以了。

具體的 mysql 查詢語句:

select * from grade g1 
where (
select count(*) from grade g2 where g2.class=g1.class and g2.score>g1.score
)<2 order by g1.class asc,g1.score desc

    這句查詢語句的意思是:查詢整個表的數據,在查詢過程中統計出班里成績比他高的人數,然后篩選出這個統計人數小于2的學生記錄。其實,不要后面的 order by 也能查出我們想要的結果,只不過結果比較混亂。而加上 order by排序是讓查詢結果以班級排序,然后每個班級里又按成績降序排序,讓查詢結果一目了然。

    

    通過上面的獲取每個班級前 2 的學生記錄,我們同樣可以獲取排名倒數 2 名的學生記錄:

select * from grade g1 
where(
select count(*) from grade g2 where g2.class=g1.class and g2.score<g1.score 
)<2 order by g1.class asc, g1.score asc

    

    這個成績查詢只不過是一個引子,還有很多其它場景的應用與此類似,比如查詢每個部門工資最高的幾人,商品中每類商品中價格最高的幾樣產品等等,只要摸透了這個每組查詢篩選信息的邏輯,其它的就不成問題。

文章版權及轉載聲明:

作者:心月 本文地址:http://www.rawkpk.live/mysql/253.html發布于 2019-07-01
文章轉載或復制請以超鏈接形式并注明出處心月IT博客

分享到:
贊(

發表評論

快捷輸入:

    評論列表 (有 0 條評論,人圍觀)參與討論