【sql】排名问题

有这么一个需求,需要查询出若干考生的成绩,其中总分一致的情况下,按照语文成绩排序;语文成绩一致的情况下,按照数学成绩排序;数学成绩一致的情况下,按照英语成绩排序......

假设表result内容如下:

实现sql为:

SELECT
	zkzh,
	( yw + sx + yy ) AS zf,
	yw,
	sx,
	yy 
FROM
    result
ORDER BY
	zf DESC,
	yw DESC,
	sx DESC,
	yy DESC

很简单是吧。然后需求变化了,需要增加排名,咋办?

SELECT
	zkzh,
	( yw + sx + yy ) AS zf,
	yw,
	sx,
	yy,
	@rank := @rank + 1  as rank
FROM
	result,
	( SELECT @rank := 0 ) rank 
ORDER BY
	zf DESC,
	yw DESC,
	sx DESC,
	yy DESC

哎呦,还不错哦

这时候,需求又变化了,总分重复的情况下,排名应该是一样。有问题没有?没得问题!扫码改需求!给钱就是大爷!

SELECT
	zkzh,
	( yw + sx + yy ) AS zf,
	yw,
	sx,
	yy,
    IF ( @zf = ( yw + sx + yy ), @rank := @rank, @rank := @rank + 1 ) AS rank,
	@zf := ( yw + sx + yy ) AS temp 
FROM
	result,
	( SELECT @rank := 0, @zf := 0 ) t
ORDER BY
	zf DESC,
	yw DESC,
	sx DESC,
	yy DESC

So nice!客户是这么容易满足的吗?

当然不是。

两个第4名之后,是不是第6名更好一点?好你个锤子啊,我的30米长的大刀呢?????

这里也有一个思路。

SELECT
	zkzh,
	( yw + sx + yy ) AS zf,
	yw,
	sx,
	yy,
	(
SELECT
	count( * ) + 1 
FROM
   result 
WHERE
	( yw + sx + yy ) > ( a.yw + a.sx + a.yy ) 
	) AS rank 
FROM
	result a 
ORDER BY
	zf DESC,
	yw DESC,
	sx DESC,
	yy DESC

But,懂的人就知道,这种方式在数据量大的时候是行不通的,是慢得你怀疑人生,当然小数据量的时候可以随意。

当然也可以用下面这个方案。

SELECT
	zkzh,
	( yw + sx + yy ) AS zf,
	yw,
	sx,
	yy,
    IF ( @zf = ( yw + sx + yy ), @rank := @rank, @rank := @rows + 1 ) AS rank,
	@zf := ( yw + sx + yy ) AS temp,
	@rows := @rows + 1 AS rows 
FROM
	result,
	( SELECT @rank := 0, @zf := 0, @rows := 0 ) t 
ORDER BY
	zf DESC,
	yw DESC,
	sx DESC,
	yy DESC

应该没啥改的了吧?

 

反正菜刀已经摆桌子上了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值