好的,我想,我明白你现在想要什么,让我澄清一下在查询之前确认。每个用户需要1条记录。对于每个用户,您想要他们的最佳积分记录。每个用户的最佳点数,您想要的平均时间最好。一旦你拥有所有的用户“最好”的价值观,你希望最终的结果排在第一位的最佳分数…几乎像竞争对手的排名。
所以现在查询。如果上述声明准确无误,您需要首先得到每人的最佳点/平均时间,并为该条目分配“等级”。这很容易使用MySQL @变量完成。然后,只需包含一个HAVING子句,只保留这些记录为每个人排名1。最后按最佳点和最短平均时间应用顺序。
select
U.UserName,
PreSortedPerUser.Point,
PreSortedPerUser.Avg_Time,
@UserRank := if( @lastUserID = PreSortedPerUser.User_ID, @UserRank +1, 1 ) FinalRank,
@lastUserID := PreSortedPerUser.User_ID
from
( select
S.user_id,
S.point,
S.avg_time
from
Scores S
order by
S.user_id,
S.point DESC,
S.Avg_Time ) PreSortedPerUser
JOIN Users U
on PreSortedPerUser.user_ID = U.ID,
( select @lastUserID := 0,
@UserRank := 0 ) sqlvars
having
FinalRank = 1
order by
Point Desc,
Avg_Time
请注意,由于需要获取答案的内联@variables,每行末尾有两个额外的列。这些只是“遗留”,并且可以在您尝试执行的任何实际输出演示文稿中被忽略…或者,您可以将整个内容包装在一个更高的层次上,以获得所需的几个列
select
PQ.UserName,
PQ.Point,
PQ.Avg_Time
from
( entire query above pasted here ) as PQ