在MySQL中,不存在类似于SQL Server或Orcal等中的rank()函数来得到排名;所以我们需要手动地写这个rank功能。
    基本知识:

    sql语句中,使用@来定义一个变量。如:@abc
    sql语句中,使用:=来给变量赋值,:@abc:=123,则变量abc的值为123
    sql语句中,if(A,B,C)表示,如果A条件成立,那么执行B,否则执行C,如:
    @abc := if(2>1,100,200)的结果是,abc的值为100。
    ◎case…when…then语句
    case…when…then语句有两种情况:
    case情况一(CASE 后面不带表达式):

    1. CASE WHEN expression THEN 操作1
    2. WHEN expression THEN 操作2
    3. .......
    4. ELSE 操作n
    5. END

    注:自上而下,凡是走了其中一个when或者是走了else了,其他的都不再走了。

    1. case情况二(CASE 后面带表达式,此时WHEN 后面的则是该表达式可能的值):
    1. CASE expression
    2. WHEN expression的值1 THEN 操作1
    3. WHEN expression的值2 THEN 操作2
    4. .......
    5. ELSE 操作n
    6. END

    排序有三种情况 MySQL中实现rank排名查询 - 图11.排列项相同时,排名继续增加

    1. @abc:=@abc+1as rank

    2.排列项(XXX)相同时,排名相同;但是到下一个排列项不同时,排名不跳级,继续+1
    ①Case…when…

    1. set @abc=0;
    2. set @preabc=null;
    3. case
    4. when @preabc=XXX then @abc
    5. when @preabc:=XXX then @abc:=@abc+1
    6. end as rank

    ②if(a,b,c) 会输出一行@preabc

    1. set @abc=0;
    2. set @preabc=null;
    3. select xx,if(@preabc=xx,@abc,@abc:=@abc+1)as rank,@preabc=XX

    3.排列项相同时,排名相同;但是到下一个排列项不同时,排名跳级+n

    1. set @abc=0;
    2. set @preabc=null;
    3. set @incabc=1;
    4. select xx,@abc:=if(@preabc=xx,@abc,@incabc)asrank,
    5. @incabc:=@incabc+1,
    6. @preabc:=xx