在做“分数排名”问题时,运行语句总是出现“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;