Рейтинг MySQL (пользователи с самым высоким рейтингом) - PullRequest
1 голос
/ 14 марта 2011

Мне нужен список лучших игроков в игре. Ранг рассчитывается на лету, а данные берутся из двух таблиц. Мне удалось упорядочить их правильным способом, но трюк @rank: = 0 -> @rank: = @ rank + 1, где дополнительное поле с именем rank вычисляет позицию игрока, который соответствует определенному параметру порядка, не возвращает правильный порядок ранга. Вот что у меня есть:

SET @rank := 0;
SELECT 
@overall := u_p_s.exploration + u_p_s.story + u_p_s.collection + u_p.experience AS overall,
@rank := @rank + 1 AS rank,
u.nick, u.user_id, u_p_s.exploration, u_p_s.story, u_p_s.collection, u_p.experience
FROM user AS u
INNER JOIN user_profile_stats AS u_p_s ON u_p_s.user_id = u.user_id
INNER JOIN user_profile AS u_p ON u_p.user_id = u.user_id
ORDER BY overall DESC
LIMIT 0 ,20;

Результат: правильный общий порядок , но неправильный порядок ранга . Я всегда могу посчитать строки и получить ранг на уровне приложения, но мне все еще нужно знать, что не так с моим запросом здесь. Если у вас есть какие-либо предложения о том, как рассчитать рейтинг конкретного пользователя, я открыт для предложений. Я видел много подобных вопросов, но ни один из них не вычисляет параметр ранжирования на лету ( в целом ), и, поскольку я не лучший в MySql, прошу вашей помощи. Спасибо.

Решение:

SET @rank:=0;
SELECT 
@rank := @rank +1 AS rank,
nick, user_id, story, overall, collection, experience, exploration
FROM (
SELECT @overall := u_p_s.exploration + u_p_s.story + u_p_s.collection + u_p.experience AS overall, 
u.nick, u.user_id, u_p_s.story, u_p.experience, u_p_s.collection, u_p_s.exploration
FROM user AS u
INNER JOIN user_profile_stats AS u_p_s ON u_p_s.user_id = u.user_id
INNER JOIN user_profile AS u_p ON u_p.user_id = u.user_id
ORDER BY overall DESC
LIMIT 0 , 20
) AS result

1 Ответ

2 голосов
/ 14 марта 2011

Думаю, проблема в том, что вы сначала рассчитываете ранг, прежде чем произойдет заказ.

Что если вы попробуете что-то вроде этого:

SELECT
@rank := @rank + 1 AS rank,
overall, u.nick, u.user_id, ...
FROM (SELECT ... <your query including ORDER BY>)
...