MySQL分数排名问题“ERROR 1064 (42000)”解决方法

在做“分数排名”问题时,运行语句总是出现“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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章