2017-04-18 2 views
0

많은 사람들이 여러 게임을 여러 번 할 수있는 멀티 게임 토너먼트 점수 판을 만들고 있습니다. 각 게임의 점수에 따라 점수를 지정합니다. 실제 점수가 아닙니다.여러 게임의 플레이어에게 순위별로 점수 지정

예컨대

동키 콩 (Donkey Kong)

Rank | Player | Score | Points Awarded  
1 | Player2 | 34,000 | 1,000  
2 | Player1 | 32,000 | 999  
3 | Player3 | 29,000 | 998 

Robotron

Rank | Player | Score | Points Awarded  
1 | Player1 | 39,000 | 1,000  
2 | Player3 | 32,000 | 999  
3 | Player2 | 21,000 | 998 

대회 순위

Player1 - 1,999 Points 

Player2 - 1,998 Points 

Player3 - 1,997 Points 

그래서 지금까지 내가 순위하고 포인트 계산은 ...

SELECT 
    `id`, 
    `userID`, 
    `gameID`, 
    `gamescore`, 
    `rank`, 
    1001.0 - (rank) AS points 
FROM (
    SELECT 
     `id`, 
     `userID`, 
     `gameID`, 
     `gamescore`, 
     @curr_rank := IF(@prev_rank = id, @curr_rank, @curr_rank + 1) AS rank, 
     @prev_rank := id 
    FROM 
     `submit_score`, 
     (SELECT @curr_rank := 0) y, 
     (SELECT @prev_rank := NULL) z 
    WHERE `submit_score`.`tournID` = 2 
    ORDER BY `gamescore` DESC 
) ranked_game; 

를 잘 작동하지만 순위 당 게임에서 포인트를 할당 할 수 및 각 플레이어 점의 총계를 가질 필요가 내가 할 수있는 그런 다음 목록에 표시하십시오.

+0

먼저 별도의 데이터 포인트. 두 번째 - 수여 된 포인트는 항상 1 위부터 가장 낮은 점수까지 동일 할 것입니까? 비즈니스 로직을 코드로 옮기고 있습니까? – JackTheKnife

+0

예 점은 항상 순위마다 동일합니다. –

+0

OK -이 값은 중복되므로 (게임 당 순위도 마찬가지이므로) DB에서 해당 데이터를 멀리 이동하십시오. 그런 다음 점수 열에 정렬 (desc)이있는 쿼리의 각 게임에 대한 배열 (해시 맵)을 만듭니다 (키가 순위 번호이고 값이 배열이 될 순위 1 등으로 가장 높은 점수를줍니다) 선수 ID와 점수의 목록). 이런 종류의 배열을 반복하면 플레이어 ID를 사용하여 임시 변수 (또는 배열)를 만들고 해당 포인트를 할당 할 수 있습니다. 마지막에는 각 플레이어 ID에 대한 총점으로 끝나야합니다. – JackTheKnife

답변

0

귀하의 DB는

선수처럼

ID | Player Nickname 
1 | Player1 
2 | Player2 
3 | Player3 

동키 콩 (Donkey Kong)

PlayerID | Score 
Player2ID | 34,000 
Player1ID | 32,000 
Player3ID | 29,000 

Robotron

뭔가를보고해야
PlayerID | Score 
Player1ID | 39,000 
Player3ID | 32,000 
Player2ID | 21,000 

DB는 데이터를 저장하는 데에만 사용해야합니다. 랭크 포인트와 수여 포인트는 중복 부품 인 것처럼 코드로 옮겨야합니다.

그런 다음 각 테이블에 점수 열에 desc 정렬을 쿼리하십시오. 최고 득점자가 # 1 등으로 순위가 매겨진 테이블을 생성합니다. 키가 순위 # (1+ 증분)이고 값이 저장된 플레이어 데이터가있는 다른 배열이 될 수있는 키 - 값으로 각 게임의 배열에 데이터 저장소를 검색합니다 join 후)와 score 또는 PlayerX와 같은 문자열? 실제 점수가 필요한 경우 플레이어 데이터 만 게임마다 점수를 매겨 야하므로 점수 데이터가 필요한 경우 점수 #.

그 다음에 플레이어 테이블을 둘러보고 각 게임 배열을 반복하면서 검색된 토너먼트 지점을 저장하고 각 순위의 토너먼트 점수를 줄이고 적절한 플레이어에게 할당 할 플레이어 배열을 만들어야합니다.

희망 하시겠습니까?

PS.데이터 나 각 게임

에 대한

set @max_points=1000; 
select Rank, Player, 
@current_points := IF(Rank = 1, @max_points, @current_points-1) AS points 
from DonkeyKong 

같은 전망 뭔가를 만들 것 기존 는 모든 대회 합계를 최종보기를 할 관계에서

select dk.Player AS Player,(dk.Points + ro.Points) AS Total 
from RO_view AS ro 
left join DK_view AS dk 
on dk.Player = ro.Player 
+0

불행히도 나는 다른 많은 프로세스가 submit_score 테이블에서 끌어 당기는만큼 구조 변경 수준을 만들 수는 없다. –

+0

@ Joel'Maximus'GriffinDodd는 각 게임마다 뷰를 생성하고 최종보기를 만드는 것에 대해 생각해 본다. 총액은 완벽하지는 않지만 기존 데이터를 처리해야합니다. – JackTheKnife

+0

글쎄, 문제는 5000 개가 넘는 게임 타이틀을 보유하고 있으며, 전 세계 곳곳에있는 각 게임 인스턴스의 1000 개가 각 게임 인스턴스에 대한 테이블을 가지고 있다는 것입니다. 실용적이지 않다. –