关于mysql中的排名次问题
这是我的表结构+------+--------+---------+------+------+------+------+------+
| xh | xm | bj | yw | sx | yy | zf | mc |
+------+--------+---------+------+------+------+------+------+
| 1001 | 陈燕 | 一(1) | 95 | 99 |100 |294 | NULL |
| 1002 | 李华 | 一(1) | 95 | 99 |100 |294 | NULL |
| 1003 | 唐瑶 | 一(1) | 93 | 92 | 85 |270 | NULL |
| 1004 | 顾平 | 一(2) | 92 | 93 | 86 |271 | NULL |
| 1005 | 刘萍 | 一(2) | 91 | 94 | 87 |272 | NULL |
| 1006 | 尹明 | 一(2) | 90 | 95 | 88 |273 | NULL |
| 3006 | 林春 | 一(2) | 60 | 85 | 53 |198 | NULL |
| 1008 | 徐华 | 一(2) |100 |100 |100 |300 | NULL |
+------+--------+---------+------+------+------+------+------+
这是我的表结构,我想实现的功能就像excel中的rank函数 根据总分的值返回学生的名次,并且对应的名次能够写入表中的mc字段中
而且要实现并列名次的效果如上面总分最高分是300 在对应的mc 字段通过写入操作把原来NULL的地方改成1,总分中还有2个294分,排第2名,也对应的写入mc里,再这之后就是273,因为有2个并列第2名,273不在是第3名,而是第4名,我把excel中实现的效果贴出来(如下),可以看出没有第3名了。
学号姓名班级语文数学英语总分名次
1001陈燕一(1)95991002942
1002李华一(1)95991002942
1003唐瑶一(1)9392852707
1004顾平一(2)9293862716
1005刘萍一(2)9194872725
1006尹明一(2)9095882734
1007林春一(2)6085531988
1008徐华一(2)1001001003001
我试了selecta.xh ,a.xm ,a.zf, count( distinct b.zf )名次 from fs a left join fs b on b.zf<=a.zf group by a.xh ,a.xm ,a.zf; 这个语句只显示排序结果(而且不够完美),不能写入到mc字段中去
又试了select a.* from ( SELECT xm, zf, @rownum := @rownum +1 AS mc FROM fs t, (SELECT @rownum :=0) r order by zf desc)a;这个语句
也不能显示想要的结果,不能实现并列名次
不知道这个功能在mysql中有没有办法实现,因为刚学mysql,所以上面的语句都是从网上搜索而来,不知道有没有改成符合自己要求的可能。还请帮忙。
没想出来 不知道php有没有办法实现,然后再回写到数据库 又是个算法问题...
笨办法,存储过程套游标,一个个对比,写入
游标,能举个例子吗 , set @num = 0;#名次
set @zfs = 0;#总分数
set @numas = 0;#辅助数字
SELECT name,if(@zfs <> zf,@num := @num+@numas+1,@num) AS mc,if(@zfs <> zf,@numas :=0,@numas := @numas+1) AS nums ,if(@zfs <> zf,@zfs :=zf,@zfs) AS zfs FROM number ORDER BY zf DESC;
完整文字
name mc nums zfs
徐华 1 0 300
陈燕 2 0 294
李华 2 1 294
尹明 4 0 273
刘萍 5 0 272
顾平 6 0 271
唐瑶 7 0 270
林春 8 0 198
水平有限,希望大牛改进 select * from test;
ID name score
1 a 10
2 b 9
3 c 9
4 d 8
5 e 7
6 e 10
set @rowNum = 0;
set @rowNum2 = 0;
select test.*,t2.levelid from test
join(
select score,(@rowNum:=@rowNum+1) as levelid from
(
select score,(@rowNum2:=@rowNum2+1) as gid from test group by scoreorder by gid
)t
)t2 on test.score=t2.score order by t2.levelid,test.name;
;
ID name score levelid
1 a 10 1
6 e 10 1
2 b 9 2
3 c 9 2
4 d 8 3
5 e 7 4
页:
[1]