2010-04-12 2 views
3

나는 내 게임에 대한 점수를 저장하기 위해 MySQL 데이터베이스를 사용하고 있습니다. 테이블의 매우 단순화 된 버전이 될 것데이터베이스에서 높은 점수를 얻기 위해 최적의 쿼리를 작성하는 방법은 무엇입니까?

(PlayerID - int)를 (이름 - 문자열) (점수 - int)를

내가 말 나에게 세트를 반환하는 쿼리를 형성하고 싶습니다 관심있는 플레이어가 테이블 중앙에있는 10 개의 결과.

아마도 한 가지 예가 더 명확 해집니다.

저는 높은 점수를 받았으며, 제 이름은 스티브입니다. 높은 점수 테이블을 볼 때 저 아래 5 점과 5 점을보고 싶습니다. 분명히 내가 최고 점수를 받으면 나는 9 점을 저 밑에 보게 될 것이고, 반대로, 내가 아래쪽에 있다면 나는 9 점수를 볼 것이다. 점수 표는 수천 점으로 구성 될 수 있습니다.

데이터베이스는 데이터 집합을 쿼리하기 위해 특별히 설계 되었기 때문에 결과에 대한 사후 처리의 양을 줄이고 싶습니다.

누구든지이 문제를 해결하기위한 쿼리 아이디어가 있습니까?

감사 리치

답변

2

사용자 ID 및 점수 (ID 및 userScore)가있는 경우 당신이 할 수 있습니다

SELECT * FROM Scores 
WHERE PlayerID = userId 
OR PlayerID IN (SELECT PlayerID FROM Scores WHERE Score > userScore ORDER BY Score LIMIT 5) 
OR PlayerID IN (SELECT PlayerID FROM Scores WHERE Score < userScore ORDER BY Score DESC LIMIT 5) 
ORDER BY Score 

편집을 : 귀하의 의견은 다음 : 모든 첫째, 당신이 필요로하는 현재 사용자의 순위를 알 수 있습니다. * (userUp> 0, N + usersDown < SELECT COUNT - 당신은 당신이 usersDown 같은 usersDown + userUp = 10, n은 두 개의 숫자 usersUp을 계산하고 SELECT COUNT(*) FROM Scores WHERE Score > userScore
그것은 당신에게 수를 제공 n은 다음
같은 쿼리로 알 수 당신은 MySQL의 서버 측에서 유지하려는 경우

SELECT * FROM Scores WHERE PlayerID = userId 
UNION 
SELECT * FROM Scores WHERE Score > userScore ORDER BY Score LIMIT usersUp 
UNION 
(SELECT * FROM Scores WHERE Score < userScore ORDER BY Score LIMIT usersDown) 

당신이 저장 프로 시저

+0

브릴리언트 감사에 모든 것을 수집 할 수 있습니다 :) 다음에 점수

FROM 대신 IN과 서브 쿼리의 UNION을 사용할 수 있습니다 당신. – Rich

+0

@Rich는 사용자가 가장 높은 점수를 얻었을 때 어떤 일이 일어나길 원하는지에 대해 알고 있습니까? – thecoshman

+0

-1. 그것은 하나의 질문에 대답 하나 위에 언급 된 것은 아닙니다. – erikkallen

관련 문제