【问题标题】:create user Rank system like SO with Pagination使用分页创建像 SO 这样的用户排名系统
【发布时间】:2014-03-15 18:19:22
【问题描述】:

我尽力搜索但失败了。我正在开发一个应用程序,我必须制作一个系统来根据用户的分数对用户进行排名,就像 SO 一样。搜索SO后,我找到了这个查询来创建排名系统

SELECT    uid,score,
          @curRank := @curRank + 1 AS rank
FROM      rankTable p, (SELECT @curRank := 0) r
ORDER BY  score desc

但是我怎样才能使这个查询返回特定用户的排名,例如https://stackexchange.com/leagues/1/month/stackoverflow/2014-03-01?sort=totalreputation

我就是想不通。

简而言之,我只想制作一个像 SO 那样拥有 500 万用户的排名系统。任何建议的逻辑都表示赞赏。

我正在 MySQL、PHP 和 node 上开发它。

【问题讨论】:

    标签: mysql sql pagination


    【解决方案1】:

    我尝试了以下查询,它可以解决您的查询。我也在分享我使用的数据集

    数据集

    CREATE TABLE rankTable (uid varchar(10) not null ,score int)
    insert into rankTable values('a',5)
    insert into rankTable values('b',2)
    insert into rankTable values('c',10)
    

    查询

    SELECT * FROM
    (
    SELECT    uid,score,
              @curRank := @curRank + 1 AS rank
    FROM      rankTable p, (SELECT @curRank := 0) r
    ORDER BY  score desc
    ) z where uid = 'b'
    

    限制响应

    SELECT * FROM
    (
    SELECT    uid,score,
              @curRank := @curRank + 1 AS rank
    FROM      rankTable p, (SELECT @curRank := 0) r
    ORDER BY  score desc
    ) z where uid = 'b'
    LIMIT 0*@PageNum , 30
    

    如果你还在显示所有列表

    SELECT * FROM
    (
    SELECT    uid,score,
              @curRank := @curRank + 1 AS rank
    FROM      rankTable p, (SELECT @curRank := 0) r
    ORDER BY  score desc
    ) z LIMIT 0*@PageNum , 30
    

    【讨论】:

    • 您也可以使用 like 来匹配条件,例如uid like '%b%' 而不是 uid = 'b'
    • Well Durgesh 我怎样才能让它返回 30 个用户以及 uid b 保持排名?
    • 更新包括限制
    • Durgesh 它给出了语法错误,在哪里指定要包含哪些用户? * @PageNum 处的语法错误,30
    • Durgesh 很抱歉问这个问题,但我可以将查询结果存储在单独的表中以检索它吗?我在这里问了这个问题stackoverflow.com/questions/22420921/…
    【解决方案2】:

    试试这个查询以获得MySQL的排名:

    SELECT t4.uid,t4.score,
    case when t4.score2 = t4.score3 then @Rank else
    @Rank := @Rank + 1 end as rank FROM
    (SELECT t2.*,t2.score score2,t3.score score3 FROM
    (SELECT t1.*, @ROWNUM := @ROWNUM + 1 rn FROM
    (SELECT uid,score FROM rankTable ORDER BY  score desc)t1,
    (SELECT @ROWNUM := 0) r)t2 left outer join
    (SELECT t1.*, @ROWNUM1 := @ROWNUM1 + 1 rn FROM
    (SELECT uid,score FROM rankTable ORDER BY  score desc)t1,
    (SELECT @ROWNUM1 := 0) r1)t3
    on t2.rn = t3.rn + 1)t4,
    (SELECT @Rank := 0) ra;
    

    SQL Fiddle

    也许这个查询工作得更快:

    SELECT t2.*, t1.ranks FROM
    (SELECT    Score, @rank:=@rank+1 Ranks FROM
    (SELECT  DISTINCT Score FROM    rankTable a
    ORDER   BY score DESC) t, (SELECT @rank:= 0)r)t1 
    INNER JOIN rankTable t2 ON t2.score = t1.score;
    

    SQL Fiddle

    【讨论】:

    • 我在当前有 200 万行的表上运行了您的查询,它花费了 30 多秒并且已达到时间限制
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2015-11-27
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多