在做“分數排名”問題時,運行語句總是出現“ERROR 1064 (42000): You have an error in your SQL syntax;”。
原因是在語句中使用了rank,而rank是mysql 的保留字。
當使用mysql保留字的時候,需要使用反引號將其引起來(就是鍵盤第二排的第一個)
開始以爲是自己的方法不對,但是報錯是語法錯誤,但是一直找不出語法錯誤,就嘗試其他解決辦法,在網上找了這道題的各種解法,全部報“ERROR 1064 (42000)語法錯誤”。搞了兩個多小時才知道自己錯在哪裏了,心態真是爆炸。特寫出解決方法紀念一下Orz,順便給出分數排名題及其解法。
問題描述: 編寫一個 SQL
查詢來實現分數排名。如果兩個分數相同,則兩個分數排名(Rank)相同。請注意,平分後的下一個名次應該是下一個連續的整數值。換句話說,名次之間不應該有“間隔”。
創建以下Scores表:
Id | Score |
---|---|
1 | 3.50 |
2 | 3.65 |
3 | 4.00 |
4 | 3.85 |
5 | 4.00 |
6 | 3.65 |
根據上述給定的 Scores 表,你的查詢應該返回(按分數從高到低排列):
Score | Rank |
---|---|
4.00 | 1 |
4.00 | 1 |
3.85 | 2 |
3.65 | 3 |
3.65 | 3 |
3.50 | 4 |
解法1:
SELECT s.score,
(SELECT count(DISTINCT score)
FROM Scores
WHERE score>=s.score) AS `Rank`
FROM Scores AS s
ORDER BY score DESC;
解法2:
select Score,
(select count(*)
from (select distinct Score as s from Scores) as new_scores
where s >= Score) `Rank`
from Scores
order by Score desc;
解法3:
SELECT
Score,
@rank := @rank + (@prev <> (@prev := Score)) `Rank`
FROM
scores,
(SELECT @rank := 0, @prev := -1) init
ORDER BY Score DESC;