爱吃冰块的鱼 发表于 2013-9-9 21:38:58

关于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,所以上面的语句都是从网上搜索而来,不知道有没有改成符合自己要求的可能。还请帮忙。

kider 发表于 2013-9-10 18:17:31

没想出来

爱吃冰块的鱼 发表于 2013-9-11 06:25:16

不知道php有没有办法实现,然后再回写到数据库

kider 发表于 2013-9-12 17:33:54

又是个算法问题...
笨办法,存储过程套游标,一个个对比,写入

爱吃冰块的鱼 发表于 2013-9-14 14:57:06

游标,能举个例子吗 ,

kongqi4321 发表于 2015-1-16 14:37:23

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
水平有限,希望大牛改进

pztx1992 发表于 2016-9-8 14:59:00

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]
查看完整版本: 关于mysql中的排名次问题