MySQL排序rank

老实说,MySQL的分类既可以用自变量法,也可以用自动截取法,但自动截取法更直观。

我们先来说说最重要的事情。
自变量法直接使用变量作为分类。
去年我们跑这个项目,用这个方法处理了8 000条数据。
第7 行@r:=@r+1 的赋值尤为关键,但要注意第9 行的ORDER BY DESC标签。
@r必须先按结果排序,再按变量排序,否则会被篡改。
还有一点是,如果希望评级是连续的,就不要添加IF(mark=b.mark,@r,@r+1 )之类的规定。
直接设置数值就可以了。
但是,当分类不连续时,例如按类别分类,则必须添加规定。
很多人不注意这一点。
说实话,这很令人困惑。

还有另一个重要的细节。
使用自变量法时,不要将评级字段标记为rank或rank,否则会直接报错。
原因是我一开始以为是关键字引起的,后来发现是一个bug,是MySQL内部处理的问题。

等等,还有别的事。
自加入的方法就是和自己比较,比如给每个学生统计分数比自己高的人有多少。
这个方法在去年的一次活动中使用过。
写法是这样的: SELECT a.sno, a. Degree, COUNT(b. Degree) ASrank_ Degree FROM Score a LEFT JOIN Score b ON a. Degree < b>去年我们跑这个项目的时候,8 万条数据跑得很快,但是有细节。
对于得分最高的人,COUNT(b. Degree) 得分将为 0,因为没有人比他更高。
很多人没有注意到这一点,所以我们需要添加一个case when a. Degree = (SELECT MAX( Degree) FROM Score) THEN 0 ELSErank_ Degree END来处理。

我认为自我跨越的方法值得尝试,但你必须能够处理边界情况。

mysql中的排序问题

记得上次我帮小明整理课业报告时,他用Excel很快就整理好了。
因此,每次增加分数时,他都必须做出重大改变。
他挠了挠头:“要是能自动安排就好了。

现在想来,他当时用的旧系统没有这个功能。
但当我设计新系统的时候,我就思考了这个问题。

比如,这次期中考试,张三英语考了1 2 0分,数学考了1 00分,科学考了9 5 分。
如果按英语排名第一,他是第一;在数学上,也许李斯已经追上了他。
这时候你总不能说“英语第一,数学不能最后”吧?
其实最好的办法就是直接在数据库中添加排序字段。
例如,使用SQL查找后,直接按照结果集中的总分降序排序。
这样,无论后面添加多少点,只要再次运行查询,出来的顺序都是正确的。

代码大概是这样的: sql SELECT 学生 ID、姓名、SUM(分数) AS 总分数 来自分数 按学生 ID、姓名分组 ORDER BY Total_score DESC
然后界面就可以得到排序后的结果并直接显示出来。

但是如果搞那种“固定排名,说英语第一,数学第二,科学第三”,那就麻烦了。
假设你英语排名第一,但后来英语考试成绩前五名都是1 3 0分,那么你就得手动调整大家的排名,或者写一个更复杂的算法重新计算。

等等,还有一件事,如果分数经常更新怎么办?每次都重新检查一下是不是有点慢?也许你可以添加一个缓存机制,比如每1 0分钟更新一次排名。

我突然想到,如果有学生请假,打印出来的空白怎么会出现呢?我应该留空还是填“0分”?这又是一个细节问题……