MySQL查詢各科成績(jī)前三名的記錄與排名的思路分析(不考慮并列)

  • 表結(jié)構(gòu)如下圖
+-----+------------+-----------+-------+
| sid | student_id | course_id | score |
+-----+------------+-----------+-------+
|   1 |          1 |         1 |    60 |
|   2 |          1 |         2 |    59 |
|   3 |          2 |         2 |    99 |
|   5 |          3 |         1 |    77 |
|   6 |          3 |         2 |    78 |
|   7 |          4 |         1 |    59 |
|   8 |          5 |         2 |    20 |
|   9 |          6 |         1 |    99 |
|  10 |          6 |         2 |   100 |
|  11 |          7 |         1 |     0 |
|  12 |          7 |         2 |     1 |
|  13 |          8 |         1 |   100 |
|  14 |          9 |         2 |   100 |
|  15 |          9 |         3 |    50 |
|  16 |          9 |         1 |    60 |
  • 排名方法如下
select s1.course_id,s1.score,count(distinct s2.score)
from score as s1
inner join score as s2
on s1.course_id = s2.course_id and s1.score >= s2.score
group by s1.course_id,s1.score
;
  • 首先將分?jǐn)?shù)表score自連接

    • 按照第一個(gè)條件 s1.course_id = s2.course_id把s1表的課程id和s2表的課程id對(duì)應(yīng)起來(lái),但是會(huì)產(chǎn)生多余的數(shù)據(jù)(會(huì)將不同sid,student_id,score,但是course_id相同的數(shù)據(jù)都連接一次),所以需要第二個(gè)條件進(jìn)一步篩選我們的理想數(shù)據(jù)

    • 按照第二個(gè)條件s1.score >= s2.score將分?jǐn)?shù)進(jìn)行對(duì)比,然后進(jìn)行連接,連接后的結(jié)果就是在同一門(mén)課程中,將每一個(gè)分?jǐn)?shù)與其他分?jǐn)?shù)(包括自己)進(jìn)行一一對(duì)比,只留下大于自己,或者等于自己的分?jǐn)?shù).

      • 到了這里,經(jīng)過(guò)連接后的表中的內(nèi)容理想的情況會(huì)是,

        • 100分是最高的,所以幾乎其他所有分?jǐn)?shù)都符合100>=其他分?jǐn)?shù) 這個(gè)條件,所以100分出現(xiàn)次數(shù)最多,
        • 又比如0分,是最低分,幾乎其他所有分?jǐn)?shù)都不符合0>=其他分?jǐn)?shù)這個(gè)條件,所以0分出現(xiàn)的次數(shù)應(yīng)該是最少的,
        • 至此,我們只要按group by s1.course_id,s1.score分組,然后count(s2.score)出現(xiàn)次數(shù)從多到少排序可以找到每門(mén)課程從高到低的分?jǐn)?shù)了.

        這里再說(shuō)一下為什么是count(s2.score),而不是count(s1.score),因?yàn)槲覀兪前磗1.score分組的,如果取count(s1.score),得到的結(jié)果都會(huì)是1

      • 但是,理想是豐滿的,現(xiàn)實(shí)卻很骨感,由于相同分?jǐn)?shù)情況的出現(xiàn),單純的去統(tǒng)計(jì)按照

        s1.course_id = s2.course_id and s1.score >= s2.score

        條件連接表的s2.score出現(xiàn)次數(shù)并不能準(zhǔn)確的排列出最高分和最低分,舉個(gè)例子說(shuō)明一下:

        • 比如不同的學(xué)生,同一門(mén)課程,都是60分,而且這種情況很多,這就會(huì)導(dǎo)致我們上面所說(shuō)的查詢方法錯(cuò)誤,有可能60出現(xiàn)的次數(shù)甚至超過(guò)100分,從而導(dǎo)致排序后出現(xiàn)的最高分成了60分.有多少個(gè)學(xué)生都是同一門(mén)課程相同的分?jǐn)?shù),我們上面所統(tǒng)計(jì)的個(gè)數(shù)就會(huì)多幾次.
        +-----------+-------+-----------------+
        | course_id | score | count(s2.score) |
        +-----------+-------+-----------------+
        |         1 |     0 |               1 |
        |         1 |    59 |               2 |
        |         1 |    60 |               8 |
        |         1 |    77 |               5 |
        |         1 |    99 |               6 |
        |         1 |   100 |              16 |
        |         2 |     1 |               1 |
        |         2 |    20 |               2 |
        |         2 |    59 |               3 |
        |         2 |    78 |               4 |
        |         2 |    99 |               5 |
        |         2 |   100 |              14 |
        
        # 如上,課目1的60分出現(xiàn)次數(shù)超過(guò)了77分出現(xiàn)的次數(shù),但是明顯60是應(yīng)該排在77之后的.
        
      • 所以select語(yǔ)句只能寫(xiě)成這樣

        select s1.course_id,s1.score,count(distinct s2.score)

      • 要去重!!!

      • 首先通過(guò)group by s1.course_id,s1.score分組,將所有相同課程,相同分?jǐn)?shù)的數(shù)據(jù)分到了一個(gè)組里面,通過(guò)count(distinct s2.score)中的distinct把重復(fù)出現(xiàn)的相同課程,相同分?jǐn)?shù)的數(shù)據(jù)去掉!!!得到我們想要的數(shù)據(jù)

      +-----------+-------+--------------------------+
      | course_id | score | count(distinct s2.score) |
      +-----------+-------+--------------------------+
      |         1 |     0 |                        1 |
      |         1 |    59 |                        2 |
      |         1 |    60 |                        3 |
      |         1 |    77 |                        4 |
      |         1 |    99 |                        5 |
      |         1 |   100 |                        6 |
      |         2 |     1 |                        1 |
      |         2 |    20 |                        2 |
      |         2 |    59 |                        3 |
      |         2 |    78 |                        4 |
      |         2 |    99 |                        5 |
      |         2 |   100 |                        6 |
      
      

      得到上面這種數(shù)據(jù),我們就可以很方便的取每門(mén)課程前幾名,或者取最高,最低分?jǐn)?shù).

    如果需要把最高的分?jǐn)?shù)顯示為1,第二的分?jǐn)?shù)顯示為2,只需要將語(yǔ)句中的>大于號(hào)改成<小于號(hào)即可

  • 如果還不能理解的話,建議一步一步加條件查看實(shí)際表的數(shù)據(jù),來(lái)體會(huì)每一條條件語(yǔ)句的作用

先看
select *
from score as s1
inner join score as s2
on s1.course_id = s2.course_id ;

再看
select *
from score as s1
inner join score as s2
on s1.course_id = s2.course_id and s1.score >= s2.score;

然后是

select s1.course_id,s1.score,count(s2.score)
from score as s1
inner join score as s2
on s1.course_id = s2.course_id and s1.score >= s2.score
group by s1.course_id,s1.score;

最后是

select s1.course_id,s1.score,count(distinct s2.score)
from score as s1
inner join score as s2
on s1.course_id = s2.course_id and s1.score >= s2.score
group by s1.course_id,s1.score;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末肋联,一起剝皮案震驚了整個(gè)濱河市秩伞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌现恼,老刑警劉巖愧捕,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奢驯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡次绘,警方通過(guò)查閱死者的電腦和手機(jī)瘪阁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)邮偎,“玉大人管跺,你說(shuō)我怎么就攤上這事『探” “怎么了豁跑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)泻云。 經(jīng)常有香客問(wèn)我艇拍,道長(zhǎng),這世上最難降的妖魔是什么宠纯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任卸夕,我火速辦了婚禮,結(jié)果婚禮上婆瓜,老公的妹妹穿的比我還像新娘娇哆。我一直安慰自己,他們只是感情好勃救,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布碍讨。 她就那樣靜靜地躺著,像睡著了一般蒙秒。 火紅的嫁衣襯著肌膚如雪勃黍。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天晕讲,我揣著相機(jī)與錄音覆获,去河邊找鬼。 笑死瓢省,一個(gè)胖子當(dāng)著我的面吹牛弄息,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勤婚,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼摹量,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起缨称,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凝果,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后睦尽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體器净,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年当凡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了山害。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沿量,死狀恐怖浪慌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情欧瘪,我是刑警寧澤眷射,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站佛掖,受9級(jí)特大地震影響妖碉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芥被,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一欧宜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拴魄,春花似錦冗茸、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至顶捷,卻和暖如春挂绰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背服赎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工葵蒂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人重虑。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓践付,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親缺厉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子永高,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • ORACLE自學(xué)教程 --create tabletestone ( id number, --序號(hào)usernam...
    落葉寂聊閱讀 1,066評(píng)論 0 0
  • 筆記: 一隧土、聚合函數(shù):計(jì)數(shù) 最大值 最小值 平均數(shù) 求和 1.計(jì)數(shù) COUNT() 忽略NULL值 方式1:COU...
    鳳之鳩閱讀 5,189評(píng)論 0 1
  • 不知不覺(jué)次洼,畢業(yè)很久关贵,你們分開(kāi)也很久了遇骑。 第一次見(jiàn)隔壁班二狗,是高一物理晚自習(xí)揖曾,他來(lái)我們班問(wèn)老師問(wèn)題落萎,只記得一個(gè)猥瑣...
    大雨驚鴻閱讀 204評(píng)論 0 0
  • 文/蕭讓 有一次,學(xué)校發(fā)了工資炭剪,我就拿著錢(qián)去存錢(qián)练链,在銀行等待存錢(qián)的時(shí)間,很慢奴拦,前面有七個(gè)人媒鼓,半個(gè)小時(shí)都過(guò)去了,還沒(méi)...
    蕭讓聽(tīng)雪閱讀 222評(píng)論 0 0
  • 我又想你了错妖,但是你是誰(shuí)绿鸣? 我常常覺(jué)得自己在想念一個(gè)人,一個(gè)還未出現(xiàn)在我生命里的人暂氯。他或許有白色的胡子潮模,她或許有耀眼...
    荏莘閱讀 174評(píng)論 0 0