第一种就是用比较常见的@rank:=@rank+1
SELECT
name as '姓名',
counts as '笔试总分',
@rank:=@rank+1 as '排名'
FROM(
SELECT
name,
IFNULL(SUM(score), 0) AS counts
FROM
users t
where
data_type = '笔试分数'
GROUP BY name
ORDER BY counts DESC) t,
(SELECT @rank:=0) p
姓名 | 笔试总分 | 排名 |
JMz | 400 | 1 |
JMzz | 387 | 2 |
这样就可以自动生成一列排名啦。
如果相同分数排名想要一样的,可以用用高级的@rank
这边的重点不在这,而是表面不用@rank这种方法来作排名
因为有的时候,在一个框架中开发一个可视化的数据库交互应用,前端传入的SQL语句中含有“:”,“,” , “;”等的字符串就报错,这个方法就可以巧妙绕过去
首先在数据库的函数里创建一个排名函数
CREATE DEFINER=`root`@`%` FUNCTION `func_row_num`(reset bit) RETURNS int(11)
begin
if reset then
set @row_num:= 0;
else
set @row_num:= IFNULL(@row_num, 0) + 1;
end if;
return @row_num;
end
然后使用这个函数 func_row_num(0)为排序 func_row_num(1为重置),所以我们在查询的时候需要先重置一下排名然后再做排名,防止排名一直叠加上去。
SELECT
name as '姓名',
counts as '笔试分数',
func_row_num(0) as '排名'
FROM(
SELECT
name,
IFNULL(sum(score), 0) AS counts,
func_row_num(1) AS rank
FROM
student
WHERE
data_type = '笔试'
GROUP BY name
ORDER BY counts DESC) t