各位好,我第一次使用這個平台發問,如果有需要改進的部分敬請指教:D
最近在自學SQL,找了網路上的50題做練習,在第15題時有一個疑問,不太懂怎麼解釋會比較好,爬了一些文也沒有找到ˊˇˋ
https://zhuanlan.zhihu.com/p/67645448 這個網址的第15題(15.按各科成绩进行排序,并显示排名, Score 重复时保留名次空缺)!
作者的程式碼:
select a.*,count(a.score) rank from sc a
left join sc b on a.cid = b.cid and a.score < b.score
group by a.cid,a.sid
order by a.cid,rank
我有疑問的是在 a.score < b.score 這邊
a跟b都是SC的表,不太懂這個部分要怎麼解釋,拿a表、b表的值比較的話,值不是一樣的嗎 @@
非常謝謝各位耐心地看完!!ヽ(✿゚▽゚)ノ
a 跟 b 都是 sc
內容完全一樣
但是在 left join 之後
一切就不一樣了
以下是個不太好的說明
看過之後就可以忘掉
單純以 CId=02, score=80 為例
1.首先是原始資料
SId | CId | score |
---|---|---|
01 | 01 | 80 |
01 | 02 | 90 |
01 | 03 | 99 |
02 | 01 | 70 |
02 | 02 | 60 |
02 | 03 | 80 |
03 | 01 | 80 |
03 | 02 | 80 |
03 | 03 | 80 |
04 | 01 | 50 |
04 | 02 | 30 |
04 | 03 | 20 |
05 | 01 | 76 |
05 | 02 | 87 |
06 | 01 | 31 |
06 | 03 | 34 |
07 | 02 | 89 |
07 | 03 | 98 |
2.在 left join a.CId=b.CId 之後(以 CId=02 來看), 結果長這樣
SId | CId | score |
---|---|---|
01 | 02 | 90 |
02 | 02 | 60 |
03 | 02 | 80 |
04 | 02 | 30 |
05 | 02 | 87 |
07 | 02 | 89 |
3.再加上 a.score < b.score 之後(以 a.score=80 來看), 結果長這樣
SId | CId | score |
---|---|---|
01 | 02 | 90 |
03 | 02 | 80 |
05 | 02 | 87 |
07 | 02 | 89 |
4.這時就可以 select 出 count(a.score)=4