您的位置:首页 > 数据库 > MySQL

mysql 获得类似排名的序号

2017-12-13 09:08 148 查看
最近做一个排名的查询,用的mysql数据库,一时不知道怎么弄了

如果是oracle数据库,里面有个

rownumer() (over partition by XXX order by XXXX)


但是mysql可没这么多函数,度娘之后,发现还是要写函数到查询里

SELECT obj.*,
CASE	WHEN @rowtotal = obj.grade THEN  @rownum
WHEN @rowtotal := obj.grade THEN @rownum := @rownum + 1
WHEN @rowtotal = 0 THEN  @rownum := @rownum + 1
END AS rownum
FROM (
select *
from T_GRADE Order by grade+0 desc, CREATE_DATE asc
) obj, (SELECT @rownum := 0 ,@rowtotal := NULL) r
以上查询就是在T_GRADE表里,将分数按高到低排序,并为其加上rownum,这个rownum就是名次,分数相等的就会同样的名次

如果分数不等也要给个名次,那就是单纯的给记录加序号了,就更简单了,如下:

SELECT @rownum := @rownum + 1 as rownum
FROM (
select *
from TJ_AP_GRADE Order by e_grade+0 desc, CREATE_DATE asc
) AS obj,
(SELECT @rownum := 0 ) r
特别注意:这里的@rownum是参数,如果不清零,每次查询都会持续累加,所以这里关联了一张参数赋值为0的表

SELECT @rownum := 0

其中要明确

:= 表示赋值,右边的值给左边的

= 在这里表示的是判断,如果左右相等就返回1,不等就返回0

如:

select @num = 1 from (select @num := 0 ) a

给@num参数默认 0 ,然后判断是否等于1

这里就返回了0,

select @num = 0 from (select @num := 0 ) a


判断是否等于0 ,就返回了 1 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sql