2013-10-31 3 views
2

특정 행 기준 전후의 인접한 N 및 M 행을 선택하려고합니다. 사용자의 개인 점수에 초점을 맞춘 높은 점수 표 (위의 N과 M 아래의 비슷한 점수).MySQL - 특정 행 기준을 기준으로 행 선택

 
scores 
------- 
id:int 
username:varchar(120) 
score:int 

참고 : 각 사용자 이름에는 여러 개의 점수가 있습니다. 대부분의 아니다 - 나는 임의의 사용자에 대해이 작업을 수행하기 위해 노력하고있어하지만 SELECT max(score),username FROM scores GROUP BY username, ORDER BY score DESC

: 높은 점수 데이터베이스는 점수가 바로 세계 10 대 점수를 가져 오기 위해, 그래서

덤프 단순히 운 좋게도 상위 10 위 안에들 수 있습니다 ...

사용자 점수보다 10 점수를 낮추려면 특정 사용자의 점수보다 위의 N 행과 M 행을 어떻게 참조해야합니까?

+0

결과에 최대 점수를 포함 하시겠습니까? 그리고 사용자가 많은 최대 결과 (N과 M을 계산하는 데 사용해야하는)가 많으면 어떻게해야합니까? – jonasnas

답변

3

모든 점수 별개 가정하면, 사용자가 상기 N의 결과를 얻기 위해 :

select s.* 
from scores 
where s.score > (select s.score from scores where username = $username) 
order by score desc 
limit N; 

주어진 사용자보다 적은 M 점수를 얻을하려면 찾을

select s.* 
from scores 
where s.score < (select s.score from scores where username = $username) 
order by score asc 
limit M; 

가 동일한 점수를 갖는 것은 포즈 작은 도전. 다음은 위의 두 가지를 union all과 결합하여이 문제를 해결합니다.

(select s.* 
from scores s cross join 
     (select * from scores where username = $username) u 
where s.score > u.score or 
     s.score = u.score and s.id > u.id 
order by s.score desc, s.id desc 
limit N 
) union all 
(select s.* 
from scores s cross join 
     (select * from scores where username = $username) u 
where s.score < u.score or 
     s.score = u.score and s.id < u.id 
order by s.score, s.id 
limit M 
)