Ответ 1
Хорошо, я ДУМАЮ, Я понимаю, что вы хотите сейчас, и позвольте мне уточнить, чтобы подтвердить запрос. Вы хотите 1 запись для каждого пользователя. Для каждого пользователя вы хотите, чтобы их рейтинг BEST POINTS. Из лучших баллов на одного пользователя вы хотите получить лучшее среднее время. Когда у вас есть все "лучшие" значения для всех пользователей, вы хотите, чтобы конечные результаты отсортировались с лучшими моментами в первую очередь... Почти как ранжирование соревнования.
Итак, теперь запрос. Если приведенное выше утверждение является точным, вам нужно начать с получения наилучшего времени/среднего времени на человека и назначения "Ранга" для этой записи. Это легко сделать с использованием переменных 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
Результаты, обработанные SQLFiddle
Обратите внимание, что из-за встроенных @variables, необходимых для получения ответа, в конце каждой строки есть два дополнительных столбца. Они просто "оставлены" и могут быть проигнорированы в любом фактическом представлении вывода, которое вы пытаетесь сделать... ИЛИ, вы можете обернуть всю вещь выше одного уровня, чтобы просто получить несколько столбцов, которые вы хотите, например,
select
PQ.UserName,
PQ.Point,
PQ.Avg_Time
from
( entire query above pasted here ) as PQ