2016-07-20 2 views
0

У меня есть списки пользователей с его точками и идентификатором игры. Мне нужно найти ранг указанного пользователя на основе порядка игры max (lb_point).Mysql выбрать количество запросов до достижения условия с условием

Я уже сделал запрос для получения ранга на основе индивидуальной игры следующим образом.

select count(*) AS user_rank 
             from (
               select distinct user_id 
               from leader_board 
               where lb_point >= (select max(lb_point) 
                from leader_board 
                where user_id = 1 
                and game_id = 2) 
               and game_id = 2 
             ) t 

Но мне нужно найти ранг, основанный на общей игре. Пример: у меня 3 разных игры (1,2,3). Передавая user_id, мне нужно найти его общий рейтинг среди всех трех игр. Не могли бы вы помочь мне в этом?

lb_id user_id game_id lb_point 
 
------------------------------------------------ 
 
1   1  2   670  
 
2   1  1   200  
 
3   1  2   650  
 
4   1  1   400  
 
5   3  2   700  
 
6   4  2   450  
 
7   2  1   550  
 
8   2  1   100  
 
9   1  1   200  
 
10  2  1   100  
 
11  1  1   200  
 
12  2  1   100  
 
13  1  1   200  
 
14  2  1   100  
 
15  1  1   200  
 
16  2  1   100  
 
17  1  1   200  
 
18  2  1   100  
 
19  1  1   200  
 
20  2  1   100  
 
21  1  1   200  
 
22  2  1   800 

+0

Для пользователя User_ID Вам нужен максимальный ранг абсолютный или raknk fr each game_id? покажите мне ожидаемый результат из предоставленного образца – scaisEdge

ответ

1
use sandbox; 
/*create table t (lb_id int, user_id int, game_id int, lb_point int); 
truncate table t; 
insert into t values 
(1 ,  1,  2,   670),  
(2 ,  1,  1,   200),  
(3 ,  1,  2,   650),  
(4 ,  1,  1,   400),  
(5 ,  3,  2,   700),  
(6 ,  4,  2,   450),  
(7 ,  2,  1,   550),  
(8 ,  2,  1,   100),  
(9 ,  1,  1,   200),  
(10,  2,  1,   100),  
(11,  1,  1,   200),  
(12,  2,  1,   100),  
(13,  1,  1,   200),  
(14,  2,  1,   100),  
(15,  1,  1,   200),  
(16,  2,  1,   100),  
(17,  1,  1,   200),  
(18,  2,  1,   100),  
(19,  1,  1,   200),  
(20,  2,  1,   100),  
(21,  1,  1,   200),  
(22,  2,  1,   800); 

*/ 

select t.* 
from 
(
select s.*,@rn:[email protected]+1 as rank 
from 
(
select user_id, sum(lb_point) points 
from  t 
where  lb_id = (select t1.lb_id from t t1 where t1.user_id = t.user_id and t1.game_id = t.game_id order by t1.lb_point desc limit 1) 
group by user_id 
order  by points desc 
) s 
,(select @rn:=0) rn 
) t 
where t.user_id = 1 

Внутренний запрос захватывает наибольшее количество очков за игру на одного пользователя и подводит. Следующий запрос присваивает ранг на основе агрегированной оценки для каждого пользователя. Самый внешний запрос выбирает пользователя.

+0

Спасибо большое bro :) – Naren

+0

Спасибо за вашу большую помощь. Мне нужен другой запрос, список из 10 лучших пользователей, баллы, основанные на всех играх. Не могли бы вы помочь мне в этом. – Naren

+0

Используя тот же запрос, измените последнее, где оператор равен LIMIT 10. –

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