MySQL57生成排名的方法

本文介绍了在数据库交互应用开发中遇到的特殊问题,即SQL语句中的某些字符导致错误。通过创建自定义函数`func_row_num`来实现排名功能,解决了含有特殊字符的SQL语句在某些框架中无法执行的问题。该方法允许在查询时先重置排名,再进行排名计算,确保了排名的准确性。此外,还提供了使用`@rank`变量的传统方法作为对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一种就是用比较常见的@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
姓名笔试总分排名
JMz4001
JMzz3872

这样就可以自动生成一列排名啦。

如果相同分数排名想要一样的,可以用用高级的@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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值