有这么一个需求,需要查询出若干考生的成绩,其中总分一致的情况下,按照语文成绩排序;语文成绩一致的情况下,按照数学成绩排序;数学成绩一致的情况下,按照英语成绩排序......
假设表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
应该没啥改的了吧?
反正菜刀已经摆桌子上了。