排名条目和分组依据

时间:2011-10-22 08:13:51

标签: mysql count group-by rank temp

我有一个人们在游戏中保存高分的网站。我一直试图通过查找更高的其他高分的数量来为玩家的高分评分。因此,如果查询找到5个具有更高高分的人,则该玩家的高分排名将为6。

事实是,对于每个用户,可以在数据库中记录多个分数(针对同一游戏)。这就是我想使用 GROUP BY用户的原因,当我想在游戏中只显示玩家的最佳分数时(并非他在该游戏中的所有分数)。

这是我现在使用的代码。它不起作用,因为查询似乎总是返回2(就像它总是返回那样只有一个得分高于玩家的高分)。如果我删除了 temp GROUP BY用户,则会返回一个半正确的值,因为计算给定游戏中每个玩家的所有得分(如果玩家是游戏中的多个得分)。

$count3 = mysql_result(mysql_query("SELECT COUNT(*) + 1 as Num FROM (SELECT * FROM ava_highscores WHERE game = $id AND leaderboard = $get_leaderboard[leaderboard_id] AND score > '$highscore2[score]') temp GROUP BY user");

1 个答案:

答案 0 :(得分:2)

当您使用GROUP BY时,COUNT会返回每组的行数,而不是结果集中所有行的单个计数。请改用COUNT(DISTINCT ...)。你也不需要内部选择。您可以将其全部写为单个查询:

SELECT COUNT(DISTINCT `user`) + 1 AS Num
FROM ava_highscores
WHERE game = '3'
AND leaderboard = '5'
AND score > '1000'

备注

  • 确保您的score列是数字类型(不是varchar类型),以便比较正常。
  • (game, leaderboard, score)上添加索引可以提高查询效率。索引中列的顺序也很重要。