mysql-單張表中《查詢各科成績前兩名的記錄》

先上表結構及SQL語句:
建表腳本(不規範的以漢字建吧,顧名思義):
DROP TABLE IF EXISTS score;

CREATE TABLE score (
學號 varchar(100) NOT NULL,
課程號 varchar(100) NOT NULL,
成績 varchar(100) DEFAULT NULL,
PRIMARY KEY (學號,課程號)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into score(學號,課程號,成績) values (‘0001’,‘001’,‘30’),(‘0001’,‘002’,‘88’),(‘0001’,‘003’,‘45’),(‘0002’,‘001’,‘57’),(‘0002’,‘003’,‘33’),(‘0003’,‘002’,‘88’),(‘0003’,‘003’,‘45’),(‘0004’,‘001’,‘40’),(‘0004’,‘003’,‘78’),(‘0004’,‘004’,‘66’);

查詢SQL:
1、SELECT s1.學號, s1.課程號, s1.成績
FROM score s1
WHERE EXISTS (SELECT COUNT(1) FROM score s2 WHERE s2.課程號 = s1.課程號 AND s2.成績 > s1.成績
HAVING COUNT(1) < 2)
ORDER BY s1.課程號, s1.成績 DESC;
2、SELECT s1.學號, s1.課程號, s1.成績
FROM score s1
WHERE (SELECT COUNT(1) FROM score s2 WHERE s2.課程號 = s1.課程號 AND s2.成績 > s1.成績) < 2
ORDER BY s1.課程號, s1.成績 DESC;
上面兩個SQL其實是一樣的,不同的寫法而已。

主要問題來了:我搜索了百度很多類似SQL。其實也有寫對的,但是評論沒人回覆,然而評論總是那麼相似,好多人說數據重複了,就不對了,怎麼出來大於2條或者3條、4條等等。其實問題就出在這,你品,你細品。《查詢各科成績前兩名的記錄》,人家讓查前兩名的成績,比如:課程號-003,成績由高至低倒序排名有一個90分,三個85分,那麼最終記錄應該是四條纔對,因爲三個85分並列第二名,那就他們就都屬於前兩名。
結果誤區:並不是一個90,一個85.這其實屬於前兩條,而不是前兩名。如果真的取一個90,一個85,那麼三個85分你到底取張三的85、李四的85、還是王五的85成績?好,你隨機取一個,其他兩個人要跟你幹架了,問你:“憑什麼不是他們”?生活中這種場景幾乎沒有,換句話說,這種場景不合理。
PS:你非要犟,你就說取前兩條一個90,一個85。hh~ Sorry,目前我也不會,如果會,請留言,謝謝~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章