我有三个表,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本身操作上面的代码,这是我无法做到的。
答案 0 :(得分:1)
一旦您知道目标用户的level
和clear_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 < ?)
如果需要,您可以使用其他联接或子查询来获取同一查询中目标用户的缺失信息。我将把它作为读者的练习。