2013-06-05 3 views
2

Извините за размещение еще один вопрос о MySQL рейтинга, но все вопросы и ответы, которые я уже смотрел не помогли мне ....MySQL ранга из результатов

У меня есть MySQL таблицы точек пользователя. У пользователя может быть больше результатов. Моя цель - получить максимальный результат от пользователя и его ранга.

CREATE TABLE results 
(`user_id` int, `points` int); 

INSERT INTO results VALUES 
(1,10), 
(2,20), 
(3,20), 
(4,30), 
(4,60), 
(5,5), 
(1,80); 

Так верхнее решение будет:

rank | user_id | points 
1  1  80 
2  4  60 
3  3  20 
3  2  20 
4  5  5 

ответ

1

Следующий запрос делает трюк:

SET @rank=0; 
SET @points=0; 

SELECT @rank := IF(@points = a.points, @rank, @rank + 1) AS rank, a.user_id, @points := a.points AS points 
FROM (
    SELECT user_id, MAX(points) as points 
    FROM results 
    GROUP BY user_id 
) a 
ORDER BY a.points DESC; 

Я также создал SQLFiddle из него, так что вы можете видеть, что это работает: http://sqlfiddle.com/#!2/7ba2f/12

+0

, но пользователи с id 2 и id 3 имеют одинаковый результат, и оба должны иметь одинаковый ранг. – Gasper

+0

@ gašper Вы были правы. Я исправил проблему. –

+0

спасибо, что он сейчас работает! – Gasper

0

Используйте определенный пользователь переменный для получения ранга при выборе из агрегированного совмещенного запроса, который вычисляет максимальное значение для каждого пользователя:

select 
    (@rank := ifnull(@rank, 0) + 1) as rank, 
    user_id, 
    points 
from (select 
    user_id, 
    max(points) as points 
    from results 
    group by 1 
    order by 2 desc) x 

FYI, UDV начинает жизнь как нуль, следовательно, вызов ifnull().

+0

это не совсем правильно, см Http: // sqlfiddle .com/#! 2/14a52/2 – Gasper

+0

в вашем примере sqlfiddle пользователи с id 4 и id 1 должны иметь одинаковый ранг ... – Gasper

Смежные вопросы