排行榜的问题,如果设置榜单排名?现在有一个问题,我有一组数据可以得到一个排行名次。
譬如,有一个原始表table1account | value1 | value2
--------------------------
aaa        10        20
bbb        30        40
ccc        15        30
我对其insert .. select .. order by value1 desc;
插入到另一个表table2结果就是。table2就是一个排行榜结果表。account | value1 
-----------------
bbb        30    
ccc        15
aaa        10    
*******************************************
*****************问题来了******************
*******************************************
1. 我如何知道ccc在这个排行中的名次?
2. 如果换种方法:
我直接将名次插入到数据库中,增加一列,怎么办?
即:account | value1 | Order
------------------------
bbb        30        1 
ccc        15        2
aaa        10        3非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!

解决方案 »

  1.   

    假设value1唯一
    set @num=1;
    insert .. select *,@num:=@num+1 from tt order by value1 desc;orselect a.account,a.value1,count(b.*) from tt a left join tt b on a.value1<=b.value1
      

  2.   

    select account,value1,(select count(1)+1 from tt where value1<t.value1 ) rank  from tt t order by rank;
    +---------+--------+------+
    | account | value1 | rank |
    +---------+--------+------+
    | aaa     |     10 |    1 |
    | ccc     |     15 |    2 |
    | bbb     |     30 |    3 |
    +---------+--------+------+
    3 rows in set (0.00 sec)
      

  3.   

    select account,value1,(select count(1)+1 from tt where value1>t.value1 ) rank  from tt t order by rank;
    +---------+--------+------+
    | account | value1 | rank |
    +---------+--------+------+
    | bbb     |     30 |    1 |
    | ccc     |     15 |    2 |
    | aaa     |     10 |    3 |
    +---------+--------+------+
    3 rows in set (0.00 sec)
    上边那个写反了
      

  4.   

    select account,value1,(select count(1)+1 from tt where value1>t.value1 ) rank  from tt t order by rank;
    楼上能解释一下着啥意思马?我不是专业的SQL程序。
      

  5.   

    假设value1唯一
    set @num=0;
    insert .. select *,@num:=@num+1 from tt order by value1 desc;orselect a.account,a.value1,count(b.*) from tt a left join tt b on a.value1<=b.value1 group by a.account,a.value1
      

  6.   

    自己测试一下 嘛
    select * from tt a left join tt b on a.value1<=b.value1
    看看结果
      

  7.   

    create procedure sp_test()
    begin
     set @a:=1
     select @a := @a + 1,* from ccc
    endcall sp_test();
      

  8.   


    这样貌似会有问题,我发现select ... insert的时候有的时候不是顺序的
      

  9.   

    呵呵,你是在insert的时候就插入了。他的意思好像是select出来的时候再设置一个值。
      

  10.   

    INSERT top_level
    SELECT t0.ID, t0.Level, t0.Name, nRankOrder = nRankOrder + 1 FROM account AS t0
    ORDER BY Level Desc Limit 5000;简化完就是这样。结果nRankOrder对应的列里面都是0
      

  11.   

    set @nRankOrder=0;
    INSERT top_level
    SELECT t0.ID, t0.Level, t0.Name, nRankOrder:= nRankOrder + 1 FROM account AS t0
    ORDER BY Level Desc Limit 5000;
      

  12.   


    DELIMITER $$DROP PROCEDURE IF EXISTS `database`.`top_create_level` $$
    CREATE PROCEDURE `database`.`top_create_level` ()
    BEGIN DECLARE nRankOrder INT;
    SET nRankOrder = 1;  # clear current table
      TRUNCATE TABLE database.top_level;  INSERT database.top_level
      SELECT t0.ID, t0.Level, t0.Name, nRankOrder = nRankOrder + 1
      FROM database.account AS t0
      ORDER BY t0.Level Desc Limit 5000;END $$DELIMITER ;
      

  13.   

     SELECT t0.ID, t0.Level, t0.Name, nRankOrder:= nRankOrder + 1
      

  14.   

    nRankOrder:= nRankOrder + 1放到存储过程里面 := 会报1064错误。
      

  15.   


    value1肯定不唯一啊。值可能一样。
      

  16.   

    DELIMITER $$DROP PROCEDURE IF EXISTS `database`.`top_create_level` $$
    CREATE PROCEDURE `database`.`top_create_level` ()
    BEGIN
       
        SET @nRankOrder = 1;
      TRUNCATE TABLE `database`.top_level;
      SELECT t0.ID, t0.`LEVEL`,t0.`NAME`,@nRankOrder:=@nRankOrder+1 FROM `database`.account AS t0
      ORDER BY t0.LEVEL DESC LIMIT 5000; 
    -- INSERT INTO `database`.top_level
    END $$DELIMITER ;
      

  17.   

    DELIMITER $$DROP PROCEDURE IF EXISTS `database`.`top_create_level` $$
    CREATE PROCEDURE `database`.`top_create_level` ()
    BEGIN    DECLARE nRankOrder INT;
        SET @nRankOrder := 1;  # clear current table
      TRUNCATE TABLE database.top_level;  INSERT database.top_level
      SELECT t0.ID, t0.Level, t0.Name, @nRankOrder := @nRankOrder + 1
      FROM database.account AS t0
      ORDER BY t0.Level Desc Limit 5000;END $$DELIMITER ;这样就好了。
    具体原因不明
    :=和
    =有啥区别么?。