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

如下表结构如何效率的获得自己的排名?

  •  
  •   imherer · 2019-05-05 10:24:20 +08:00 · 2777 次点击
    这是一个创建于 1789 天前的主题,其中的信息可能已经有所发展或是发生改变。

    表里主要有uidscore 两个字段,根据 score 来排名,但是表里的记录是无序的

    分页获取的话直接用ORDER BY LIMIT x OFFSET x就行了,但是如何获得自己的排名呢?

    只能获取分页数据的时候扫描全表直到扫到自己的排名为止吗?

    5 条回复    2019-05-29 21:28:59 +08:00
    pubby
        1
    pubby  
       2019-05-05 10:32:13 +08:00 via Android   ❤️ 1
    count where score>myscore ?
    imherer
        2
    imherer  
    OP
       2019-05-05 11:01:39 +08:00
    @pubby 好像可行,谢谢,我试试!
    Raymon111111
        3
    Raymon111111  
       2019-05-05 15:26:39 +08:00
    1 楼那个方法和全表扫描没区别, 就算在 score 上建了索引也不行

    最好的办法是排行榜 15 分钟刷新一次, 然后定时任务 15 分钟全扫一遍把排名统计出来放在缓存里
    imherer
        4
    imherer  
    OP
       2019-05-06 10:40:55 +08:00
    @Raymon111111 嗯。之前也做过类似的需求,结合 redis 做起来就很简单。
    现在这个是帮人弄的一个小项目,用户很少。 所以就不想用 redis 了,直接用数据库来做了。
    japinli
        5
    japinli  
       2019-05-29 21:28:59 +08:00
    用窗口函数可以不行吗?

    SELECT id, score, RANK() OVER (ORDER BY score) FROM table_name LIMIT 10 OFFSET 10;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3331 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:13 · PVG 21:13 · LAX 06:13 · JFK 09:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.