2016-07-20 9 views
0

ポイントとゲームIDを持つユーザーのリストがあります。私は、指定されたユーザーのランクを、ゲームオーダーに基づいてmax(lb_point)で見つける必要があります。条件付き条件に達するまでクエリの数を選択します。

個々のゲームに基づいてランクを取得するためのクエリは、次のように既に行っています。

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を渡すことで、私は3つのゲームすべての中で彼の全体的なランクを見つける必要があります。これで私を助けてもらえますか?

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が各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

おかげで多くの仲間:) – Naren

+0

あなたの大きな助けてくれてありがとう。別のクエリ、トップ10ユーザーのリスト、すべてのゲームに基づくポイントが必要です。これで私を助けてくれますか? – Naren

+0

同じクエリを使用して、最後のwhereステートメントをLIMIT 10に変更します。 –