0

我有三个表,分别registrations包含用户信息,leaderboard包含用户 ID 和他们当前所在的级别,最后是“clear_times”,它记录了用户清除某个级别的时间。

我正在使用 MySQL 生成排行榜。最高级别的用户将站在顶部。同一级别的用户将根据clear_time他们通过级别的时间进行排名。(最先通关的等级排在前面)。

以下是我为此目的使用的代码:

SELECT t1.level, t3.user_id, t3.user_id2, t3.user_type
FROM leaderboard AS t1
INNER JOIN clear_times AS t2 ON ( t1.uid = t2.uid AND (t1.level -1) = t2.level ) 
INNER JOIN registrations AS t3 ON ( t1.uid = t3.id ) 
ORDER BY t1.level DESC , t2.clear_time ASC

id' is a primary key of anduid` 是外键。

该代码非常适合生成排行榜。现在,我想找出给定他/她的特定用户的排名id。我可以在服务器端脚本上完成,循环记录并使用计数器变量。但我相信有一种方法可以在 MySQL 本身中以某种方式操纵上述代码,这是我做不到的。

4

1 回答 1

1

一旦你知道了目标用户的levelclear_time,你只需要计算在给定排序中排名高于的记录数:

SELECT COUNT(*)
FROM   leaderboard   AS t1
  JOIN clear_times   AS t2 ON t1.uid = t2.uid AND t1.level = t2.level + 1
  JOIN registrations AS t3 ON t1.uid = t3.id
WHERE  t1.level > ? OR (t1.level = ? AND t2.clear_time < ?)

如果需要,您可以使用进一步的联接或子查询来获取有关同一查询中目标用户的缺失信息。我将把它作为练习留给读者。

于 2013-10-29T18:49:20.993 回答