【问题标题】:mysql Ranking system based on user id基于用户id的mysql排名系统
【发布时间】:2013-01-23 19:55:47
【问题描述】:

我对来自http://jimmod.com/blog/2008/09/displaying-row-number-rownum-in-mysql/的查询有疑问

SELECT IF(@points=p.points, @rownum, @rownum:=@rownum+1) rank, 
       p.*, (@points:=p.points) dummy 
FROM `ranking` p, (SELECT @rownum:=0) x, (SELECT @points:=0) y 
ORDER BY `points` DESC

查询结果为:

rank user_id name score
-----------------------
1      4    Barney  100
2      2    Ted      88
3      1    Marshall 76
3      3    Robin    76
4      5    Lily     68

如何根据用户id得到相同的排名结果?

下面的查询是基于用户 id 的,但 Robin 的排名将是 4,而不是应该的 3。

SELECT rank FROM (SELECT @rownum:=@rownum+1 rank, p.* 
FROM `ranking` p, (SELECT @rownum:=0) r 
ORDER BY `points` DESC) a WHERE a.user_id = 3

【问题讨论】:

    标签: mysql system ranking


    【解决方案1】:

    如果不对其进行测试,似乎这应该使用子查询来工作:

    SELECT rank
    FROM (
        SELECT IF(@points=p.points, @rownum, @rownum:=@rownum+1) rank, 
           p.*, (@points:=p.points) dummy 
        FROM `ranking` p, (SELECT @rownum:=0) x, (SELECT @points:=0) y 
        ORDER BY `points` DESC
    ) t
    WHERE user_id = 3
    

    您上面的查询显示 4,因为您没有使用 RANK,而只是使用 ROW NUMBER,并且 Robin 出现在 Marshall 之后(即使它们具有相同的分数)。

    祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      相关资源
      最近更新 更多