V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shaweren
V2EX  ›  PHP

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

  •  
  •   shaweren · 2017-11-02 10:52:42 +08:00 · 2897 次点击
    这是一个创建于 2612 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    7 条回复    2017-11-06 15:39:10 +08:00
    shaweren
        1
    shaweren  
    OP
       2017-11-02 11:17:03 +08:00
    $key = '';

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

    return $key;
    dangyuluo
        2
    dangyuluo  
       2017-11-02 11:25:39 +08:00
    感觉你得依赖 redis,zset 效率更高一些。
    dangyuluo
        3
    dangyuluo  
       2017-11-02 11:29:50 +08:00
    查了下,ZRANK 是 O(log(N))复杂度。
    b821025551b
        4
    b821025551b  
       2017-11-02 11:31:42 +08:00
    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  
       2017-11-02 14:28:47 +08:00
    lyleo2010
        6
    lyleo2010  
       2017-11-03 18:04:14 +08:00
    实时获取排名猜测读取量很高,应该用缓存存排名。

    用 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  
       2017-11-06 15:39:10 +08:00
    select (@i:=@i+1) i,info.* from info, (select @i:=0) t2 ORDER BY number DESC
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1190 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:11 · PVG 02:11 · LAX 10:11 · JFK 13:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.