2017-10-06 8 views
0

나는 포인트 기반의 결과 시스템 인 순위 시스템을 보유하고 있습니다.MySQL 순위 시스템 맞춤 쿼리

User | Points 
    1 | 100 
    2 | 197 
    3 | 123 
    4 | 174 
    5 | 98 
    ... 
    197 | 21 
    198 | 110 
    199 | 154 

내 사용자 ID가 197이라고 가정하면, 그래서 처음 내 순위 기반 또는 포인트가 가장 높은 지점은 처음에는 가장 마지막에, 그래서 여기에 가정 알고 싶은 나의 순위 (사용자 ID = 197) # 150

내 순위를 얻은 후에 (내 순위가 상위 100 위 목록에없는 경우) 100 명의 사용자 목록을 얻으려는 경우 1 위부터 50 위까지의 사용자와 125 위에서 175 위까지의 사용자를 얻을 필요가 있습니다. 이 목록에서도 내 순위를 얻을 수 있지만 목록 순위는 결과에서 실제 순위가됩니다

User | Points | Rank 
18 | 199 | 1 
22 | 198 | 2 
31 | 180 | 3 
19 | 174 | 4 
51 | 168 | 5 
+ 
17 | 22 | 149 
197 | 21 | 150 
199 | 14 | 151 

나는 앱을 가지고 있습니다. PHP에서 이렇게 결과 집합을 얻는 가장 효율적이고 효과적인 방법은 무엇입니까?

+5

우리는 항상 새로운 코더를 지원하고 기쁘게 생각하지만 기쁘다. *** 당신은 먼저 자신을 도울 필요가있다. : -) *** [** 더 많은 연구를하고 **] (https://meta.stackoverflow.com/q/261592/1011527) 문제가 있다면 ** 당신이 시도한 것을 게시하십시오 ** ** 작동하지 않는 것에 대한 명확한 설명 ** 및 [Minimal, Complete, Verifiable example] (http://stackoverflow.com/help/mcve)을 제공하십시오. [묻는 방법] (http://stackoverflow.com/help/how-to-ask)을 읽어보십시오. [둘러보기] (http://stackoverflow.com/tour)를 읽고 [this] (https://meta.stackoverflow.com/q/347937/1011527)를 읽으십시오. –

답변

1

(또는 내가 가장 우아한 솔루션을 작동하지만하지 않을 수도로, '이 될 수있다'라고한다)이 될 것입니다 자신의 순위와 점수를 반환하는 전체 쿼리

SET @count = 0; 
SELECT 
    user, 
    points, 
    rank 
    FROM( 
     SELECT user, 
       points, 
        @count := @count + 1 'rank' 
     FROM scores 
     ORDER BY points DESC 
    ) as ranks; 

을 그래서 당신이 원한다면 특정 사용자의 계급, 당신의, 마지막에 where 절을 추가 거라고 알고

WHERE user = 197; 

는 특히 서식, 두 번째 부분에 관해서, 나는 그것이 PHP에서 수행 최고의 생각합니다. 당신은 당신의 '계급'을 얻을 수 위가,이 같은 것을 할 실행할 수 있습니다 (참고 : 난 그냥 의사 답변을 여기에 PHP를 인용보다는 스크립팅 해요) : 처음 50 개 결과에 대한

$myRank = [result of above query]; 

if($myRank > 100) { 

// retrieve first 50 results and display in query 1 

echo "..."; // or in a <td>, etc. 

// retrieve results x to y and display in query2, loop through a table etc. 

} 
else { 

// retrieve the first 100 if your score is in that range 

} 

는 SQL

SET @count = 0; 
SELECT 
    user, 
    points, 
    rank 
    FROM( 
     SELECT user, 
       points, 
        @count := @count + 1 'rank' 
     FROM scores 
     ORDER BY points DESC 
    ) as ranks 
    LIMIT 0,50; 

이 될 것입니다 그리고 당신은 결과의 다음 집합을 얻기 위해 PHP에서 이론적 $myRank의 출력을 사용해야 할 것입니다.

LIMIT $myRank,$upper; 

상단에서 PHP가 될 것입니다 여기서 :

$upper = $myRank+50; 

당신은 분명히 필요 거라고 당신이 당신의 순위 후 다음 (50)를 원하는 경우 예를 들어, 마지막 줄을 변경 것 당신이 정말로 완벽한 솔루션을 묶기 전에 다른 시나리오의 관점에서 달성하고자하는 것을 정확하게 파악하십시오. 그러나 이것이 도움이되기를 바랍니다.