假如有一个表
AT(int index,int a,int b)
我每天要根据表中的a的大小对整个表进行排序 并把每条数据的排名写入该数据的b里

1 8 0
2 4 0
3 12 0
4 12 0
5 3 0
处理后 变为
1 8 3
2 4 4
3 12 1
4 12 2
5 3 5
如何实现? 我用的是php做网站 用php有什么高效的实现之法?

解决方案 »

  1.   

    set @i=0;create temporary table tb_temp
    as select @i:=@i+1 as  rowid,a from  AT order by a desc, 'index' asc;update AT inner join tb_temp on AT.a=tb_temp.a
    set AT.b=tb_temp.rowid;
      

  2.   

    set @i=0; create temporary table tb_temp 
    as select @i:=@i+1 as  rowid,a from  AT order by a desc, `index` asc; update AT inner join tb_temp on AT.a=tb_temp.a 
    set AT.b=tb_temp.rowid; 
      

  3.   

    set @var1=(select max(a) from AT where b=0);
    CREATE PROCEDURE p14 ()BEGINDECLARE v INT;SET v = 1;WHILE v < (select count(*) from AT) DOUPDATE AT SET b=v WHERE a=@var1;SET v = v + 1;END WHILE;END; 
      

  4.   

    如果你单是想更新那个排名字段来给前台获取排名的话,那的表设计中表示排名的列b就显得有点多余了,因为可以直接select就可以得出那个排名了,而不用把排名存在表列中:
    写法1:
    select *,(select count(*)+1 from AT b1 where b1.a<a1.a) as rownum from AT a1写法2:
    set @i=0;
    select *,@i:=@i+1 as rownum from AT order by a desc, `index` asc;
      

  5.   

    写法1: 
    select *,(select count(*)+1 from AT b1 where b1.a <a1.a) as rownum from AT a1 写法2: 
    set @i=0; 
    select *,@i:=@i+1 as rownum from AT order by a desc, `index` asc;
      

  6.   

    CREATE PROCEDURE p14 () BEGIN DECLARE v INTSET v = 1SET var1 = (select max(a) from AT where b=0)WHILE v < (select count(*) from AT) DO UPDATE AT SET b=v WHERE a=var1SET v = v + 1END WHILEEND;
    Why is it not correct?