MySQL - 在JOINS中查找记录的位置

时间:2013-10-29 18:44:15

标签: php mysql sql

我有三个表,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 and

id uid`是外键。

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

1 个答案:

答案 0 :(得分: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 < ?)

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