在MySQL表中显示单个排名

5
我有一张名为“highscores”的表格,看起来像这样。
id      udid       name       score
1       1111       Mike       200
2       3333       Joe        300
3       4444       Billy      50
4       0000       Loser      10
5       DDDD       Face       400

给定一个特定的udid,我想返回该行根据其分数值排名。

例如,如果给定的udid = 0000,则应返回5。

有什么办法可以为MySQL数据库编写此查询?

2个回答

7

MySQL没有任何分析/排名功能,但是你可以使用一个变量来人工创建排名值:

  SELECT t.id,
         t.udid,
         t.name,
         t.score,
         @rownum := @rownum + 1 AS rank
    FROM HIGHSCORES t
    JOIN (SELECT @rownum := 0) r
ORDER BY t.score DESC

为了查看与 UDID "0000" 相关联的等级,请使用以下命令:
SELECT MAX(x.rank) AS rank
  FROM (SELECT t.id,
               t.udid,
               t.name,
               t.score,
               @rownum := @rownum + 1 AS rank
          FROM HIGHSCORES t
          JOIN (SELECT @rownum := 0) r
      ORDER BY t.score DESC) x
 WHERE x.udid = '0000'

如果用户有多个高分值,需要使用MAX。或者,您可以不使用MAX,而是使用ORDER BY rank LIMIT 1


啊,谢谢。每个UDID只有一个条目,我在我的PHP脚本中处理了这个问题。另外,我对此还有点陌生。那么这两个块如何一起工作呢?我是将它们放在同一个查询中还是接连着使用? - user261362
@MichaelInno:如果你只是想检查特定用户的等级,那么你只需要使用第二个查询。将“'0000'”替换为你要查找的任何“udid”。 - OMG Ponies
这将为具有相同分数的用户提供不同的排名。 - Josef Pfleger
@Josef:是的 - 大多数人不希望关系具有相同的等级值。 - OMG Ponies

1
为了再次强调OMG的出色答案,它是UDID多个高分的通用情况,这里是基于每个UDID确切一个条目的前提条件的查询:
SELECT rank
FROM
   (SELECT @rownum := @rownum + 1 AS rank, score, udid
    FROM highscores
    JOIN (SELECT @rownum := 0) r
    ORDER BY highscores.score DESC) x
WHERE x.udid = '0000'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接