MYSQL  表结构 user_id  rank_test(排行的依据) 俩字段SET @rank=0;SELECT @rank := @rank +1 AS rank, `rank_test`,
FROM `battlezone_rank`
ORDER BY `rank_test` DESC想请教的是  
1. 这个语句效率高不  百万级 千万级 实时查询会不会有问题
2. 我要查找某个 user_id 的排名应该怎么写?
3. 有没有其他的排名方法? (数据库结构)

解决方案 »

  1.   


    select rt.user_id,(select count(*) from battlezone_rank where user_id>rt.user_id)+1 as rank
    from rank_test rt
    order by user_id desc;
      

  2.   

    兄弟  你这貌似是根据user_id排名的吧
      

  3.   

    SET @rank=0; select rank
    from
    (
      SELECT @rank := @rank +1 AS rank, `rank_test`, 
      FROM `battlezone_rank` 
      ORDER BY `rank_test` DESC 
    ) t
    where user_id='xxx'
      

  4.   

    SELECT 
      (select count(1)+1 from `battlezone_rank` where `rank_test`>t.`rank_test`) as rank,
      `rank_test`, 
    FROM 
      `battlezone_rank`  t
    where
      userid_id='xxx'
      

  5.   

    上面的两个语句部分直接拷贝了楼主的,更正一处错误:把`rank_test`,  后面的','去掉
      

  6.   

    谢谢 josy 看到很多`rank_test`>t.`rank_test`这样来排序的了   这样效率比@rank+1高?
      

  7.   

    1. 这个语句效率高不  百万级 千万级 实时查询会不会有问题
    @rank+1 的效率已经很高了.

    2. 我要查找某个 user_id 的排名应该怎么写?
    select count(*)+1 from `battlezone_rank`  where `rank_test` >(select `rank_test`  from `battlezone_rank`  where userid_id='xxx'
      

  8.   

    还要再请教下  变量+1  和 count(*)+1   效率哪个会更高些?为什么?
    不胜感激
      

  9.   

    命题是  取得某个人的排名  5L 6L的写法做比较  
    谢谢 ACMAIN_CHM
      

  10.   


    如果这样,反而是10楼的最快(在有索引(`rank_test` ) 和 (userid_id) 情况下)。
    select count(*)+1 from `battlezone_rank`  where `rank_test` >(select `rank_test`  from `battlezone_rank`  where userid_id='xxx'
      

  11.   

    --count(*)只能用在普通排序里面,用在分组排序里面,就不对了!
    --比如:按成绩分组排序:
    有8个人的成绩:
    a 80
    b 90
    c 70
    d 70
    e 80
    f 80
    d 90
    g 90排序结果为:
    name  grade No
    a     80    2  
    b     90    1
    c     70    3
    d     70    3
    e     80    2
    f     80    2
    d     90    1
    g     90    1--楼主:高人,你用count(*)排个给我看看?
      

  12.   


    这个问题比较常见。关键是用户如何定义这个“排名”的问题。 比如对 80 的前面有两个并列第一的,这个80的是第二,还是第三,要看业务逻辑而定了。 如果80为第二,则可以用 COUNT(DISTINCT) , 但这种排名方式相对比较少见。