выборка номера места в соревновании

demon_mhm

Новичок
выборка номера места в соревновании

Есть табличка результатов scores:
PHP:
+-----------+-------+---------+
| player_id | score | game_id |
+-----------+-------+---------+
в которую сваливаются количество очков, набранных игроками в разных играх, причем от одного игрока результаты могут присылаться произвольное количество раз.
Задача: для определенного игрока выбрать высший результат по определенной игре и вычислить, какое место в рейтинге он занимает.
Поскольку количество присланных результатов заранее не известно, то примем его очень большим и задачу выборки всех результатов с последующей их обработкой в скрипте расматривать не будем.

пусть player_id = 1 и game_id = 1
напрашивается что-то вроде этого, но что-то не работает...
PHP:
select @res := max(score) from scores where player_id = 1 and game_id = 1;
select count(*) from scores where score > @res group by player_id
Подскажите пожалуйста, куда копать?
 

ТопольМ

Новичок со стажем
этим запросом хочешь выбрать число чуваков с очками больше, чем у данного игрока?
 

demon_mhm

Новичок
А рейтинг должен вычисляться путем подсчета у скольких игроков есть результаты выше, чем у данного. Хотя, во втором запросе, конечно, надо убрать group by, только тогда как отсечь повторяющиеся результаты и считать только наивысший результат для каждого игрока?
 

vovik

Новичок
Я думаю, проще всего так:

PHP:
SELECT что нужно
FROM (
  SELECT max(score) AS max_score, player_id, game_id
  FROM scores
  GROUP BY player_id, game_id
) AS max_scores
WHERE что нужно
 

demon_mhm

Новичок
Спасибо, vovik!
Получилось вот так:
PHP:
select @user_score := max(score) from scores where player_id = 2 and game_id = 1;

SELECT count(*) + 1 as rating
 FROM (
 SELECT max(score) AS max_score, player_id, game_id
 FROM scores
 GROUP BY player_id, game_id
 ) AS max_scores
 where game_id = 1 and max_score > @user_score;
Все равно в два запроса, а в один можно запихнуть?
 

chira

Новичок
demon_mhm

если у тебя подзапросы работают, зачем используешь переменную @user_score?

Код:
SELECT count(*) + 1 as rating
 FROM (
 SELECT max(score) AS max_score, player_id, game_id
 FROM scores
 GROUP BY player_id, game_id
 ) AS max_scores
,( select max(score) user_score from scores where player_id = 2 and game_id = 1) AS b
 where game_id = 1 and max_score > b.user_score;
 

demon_mhm

Новичок
Хм... интересно... надо попробовать, спасибо большое! :)
Просто я забираю количество очков для отображения, А как из этого запроса его достать, что-то не понимаю
 
Сверху