选择时带有大小写的sql

时间:2015-01-13 02:06:11

标签: mysql sql

我正在做这个问题,

  

编写SQL查询以对分数进行排名。如果两者之间存在联系   分数,两者都应该具有相同的排名。请注意,打平后,   下一个排名数应该是下一个连续的整数值。在   换句话说,应该没有"漏洞"在队伍之间。

+----+-------+
| 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    |
+-------+------+

答案是:

  

在下面写下你的MySQL查询语句

SELECT Score,   
  CASE
        WHEN @prev = Score THEN @rank
        WHEN @prev := Score THEN @rank := @rank + 1
        WHEN @rank := @rank + 1 THEN @rank
  END AS Rank
FROM Scores, (SELECT @rank := 0, @prev := NULL) r
ORDER BY Score DESC

我不明白这一部分:

WHEN @rank := @rank + 1 THEN @rank

为什么我需要这条线可以触发?

1 个答案:

答案 0 :(得分:0)

这一行:

WHEN @rank := @rank + 1 THEN @rank

递增@rank并返回递增的变量。它几乎完全等同于:

ELSE @rank := @rank + 1

(唯一的区别是NULL值,但可能是值NULL。)

逻辑是什么?当MySQL非零且非NULL时,MySQL将表达式解释为true。递增的正计数器将为非零且非NULL,因此when子句为真。然后返回该值。