MYSQL - предложение select с пользовательской переменной, не возвращающее тот же результат при использовании в подзапросе

У меня проблемы с MYSQL и надеюсь найти ответ здесь.

У меня есть таблица с оценками, и я хочу запросить пользователей, чей рейтинг находится рядом с текущим пользователем. Например, если текущий пользователь занимает 85-е место, я хочу получить пользователей с рейтингом от 80 до 90.

Это выдержка из моей таблицы результатов

uuID  |  game   |  score  |attempt  |lastAttempt  
id3   |Gravity  |  1186   |156      |2016-06-30 23:58:09 
id2   |Gravity  |  1376   |2        |2015-07-18 22:45:23 
id1   |Gravity  |  1759   |165      |2016-06-17 18:13:28
id1   |Primality|   242   |1        |2016-04-28 23:20:32 
id4   |Primality|    35   |2        |2016-05-02 21:37:07 

Конечно, таблица результатов не имеет рейтинга, она вычисляется динамически, когда я запрашиваю базу данных. И у меня есть пользовательская таблица, которая дает мне ее имя (и некоторую другую информацию, не относящуюся к моей проблеме):

uuID | userName
id1  | Mathew
id2  | Jon

Я сделал этот запрос, чтобы упорядочить оценки и присвоить каждому пользователю ранг, например, для игры "Гравитация":

SELECT @rank:=@rank+1 rank,             
       IF(@score=s.score, @rank2:=@rank2, @rank2:=@rank) rank2, 
       s.uuID, 
       Users.userName, 
       @score:=s.score score, 
       s.attempt 
FROM 
       Scores s, 
       (SELECT @rank:=0, @score:=0, @rank2:=1) r, 
       Users 
WHERE   
       Users.uuID=s.uuID
       AND s.game='Gravity'
ORDER BY score DESC, attempt ASC

Это стандартная методика, встречающаяся на нескольких форумах: я присоединяюсь к таблице временных показателей с пользовательской переменной, которая увеличивается... и просто присоединяюсь к пользовательской таблице, чтобы получить понятное имя. Обратите внимание, что я на самом деле использую 2 "ранговые" переменные, потому что я хочу, чтобы одинаковые оценки имели одинаковый ранг (и одинаковые оценки с разным количеством попыток имели разный ранг). Результат в порядке:

rank |rank2  |uuID  |userName  |score |attempt   
1    |1      |id3   |Simon     |4910  |368 
2    |2      |id5   |youssef   |4284  |246 
3    |3      |id2   |Anonymous |2688  |97
4    |4      |id7   |Anonymous |2530  |12 
5    |5      |id8   |Anogjh    |2295  |24 
6    |5      |id9   |Nick      |2295  | 7

Однако, если я использую этот запрос как подзапрос, результат будет совершенно случайным:

SELECT * FROM (XXX) temp

(XXX - предыдущий выбор с рангом и рангом 2) дает мне:

rank  |rank2  |uuID  |userName  |score | attempt 
19    |19     |  id3 |Simon     |4910  |368 
28    |28     |  id5 |youssef   |4284  |246 
26    |26     |  id2 |Anonymous |2688  |97 
32    |32     |  id7 |Anonymous |2530  |12 

таким образом, результат по-прежнему отображается в порядке убывания и попытки, но рейтинг больше не дает хорошего результата. Кажется, что теперь восходящий ранг следует за порядком восходящего uuID

Помните, что я делаю это, потому что моя цель - опросить игроков с рейтингом от 80 до 90:

SELECT * FROM (XXX) temp WHERE rank BETWEEN 80 AND 90

Может кто-нибудь объяснить мне, что происходит с подзапросом? Может быть, у кого-то есть идея получить мой результат другой техникой?

РЕДАКТИРОВАТЬ: я исправил столбец userName в описании, я подготовлю sqlfiddle

0 ответов

Другие вопросы по тегам