shaweren
V2EX  ›  PHP

PHP 怎么获取指定信息的排名?

  •  
  •   shaweren · Nov 2, 2017 · 3586 views
    This topic created in 3114 days ago, the information mentioned may be changed or developed.

    $query="select * from info ORDER BY number DESC";

    用以上方法查询获得的结果,如果得到 ID 为 6 的排名呢?

    做一个投票系统用。需要根据票数实时获取排名。

    7 replies    2017-11-06 15:39:10 +08:00
    shaweren
        1
    shaweren  
    OP
       Nov 2, 2017
    $key = '';

    foreach ($row as $k => $v) {
    if ($v['0'] == $id) {
    $key = $k + 1;
    }
    }

    return $key;
    dangyuluo
        2
    dangyuluo  
       Nov 2, 2017
    感觉你得依赖 redis,zset 效率更高一些。
    dangyuluo
        3
    dangyuluo  
       Nov 2, 2017
    查了下,ZRANK 是 O(log(N))复杂度。
    b821025551b
        4
    b821025551b  
       Nov 2, 2017
    set @rownum=0;
    select rownum from (select @rownum := @rownum +1 as rownum,users.*from info ORDER BY number DESC) as T1 where T1.id=6;
    shiji
        5
    shiji  
       Nov 2, 2017
    lyleo2010
        6
    lyleo2010  
       Nov 3, 2017
    实时获取排名猜测读取量很高,应该用缓存存排名。

    用 sql 需要嵌套子查询,需要注意索引优化,不然查询会比较慢

    php 层面可以考虑
    先跑一条 sql "SELECT id from info ORDER BY number DESC"
    查询的结果集就是根据投票数倒数排序的
    $array = [5,6,1,3,4,2];
    array_search(6,$array)// 得到 key 1
    那么排名就是 key+1 2

    不过这样对同样票数的两个 id 不太友好
    jeff0819
        7
    jeff0819  
       Nov 6, 2017
    select (@i:=@i+1) i,info.* from info, (select @i:=0) t2 ORDER BY number DESC
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1341 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 17:19 · PVG 01:19 · LAX 10:19 · JFK 13:19
    ♥ Do have faith in what you're doing.