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