最近做一个排名的查询,用的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