2017-05-23 33 views
1

결과 순위를 매기는 방법을 찾았지만 조건에 의해 필터링 된 후에 순위를 지정하는 방법에 대한 해결책을 아직 찾지 못했습니다. 내가 뭘해야입니다 :다른 테이블에 가입 한 후 MySQL 결과를 순위 지정하고 조건에 따라 필터링합니다.

1) 순서
2) 계정 테이블
3 결과 참여) 계정 테이블에서 나이와 성 결과를 (필터)
4 내림차순으로 점수를 정렬) 순위를 정하십시오.
5) IE (25-75, 아래에서 간단히하기 위해 0-10을 입력) 범위 내에서 결과를 가져옵니다.

각 솔루션 중 하나를 찾거나 순위를 제대로 지정하지 않았거나 순위를 정한 다음 결과를 필터링합니다. 그러나 이것은 1, 2, 3, 4, 5 등 또는 25, 26, 27, 28, 29 등을 원할 때 1, 3, 4, 6, 10 등과 같은 순위를 남긴다.

SELECT a.id, a.username, a.country, score, user_id, duration, rank 
FROM (
    SELECT s.*, a.age, a.gender, @rownum := @rownum + 1 AS rank 
    FROM scores s, 
     (SELECT @rownum := 0) r 
    LEFT JOIN accounts a ON 1 
    WHERE a.age>=18 && a.age<=35 && a.gender='m' 
    ORDER BY score DESC, duration DESC, time) `selection` 
LEFT JOIN accounts a ON a.id=user_id 
WHERE rank >= 0 && rank <= 10 && a.age>=18 && a.age<=35 && a.gender='m' 

위의 쿼리의 문제는 나에게 틈없이 정확한 순위를 준다이다, 그러나 점수는 순서가 완전히 있습니다 : 여기

내가 지금 가지고있는 것입니다. IE. 5, 1, 10, 7, 125, 50 등. 그들은 정렬되지 않은 데이터베이스와 동일한 순서로 나옵니다.

이 내 이전 쿼리가 어떻게 생겼는지입니다 : 내가 제대로 점수를 분류 제공하지만,

SELECT a.id, a.username, a.country, score, duration, rank 
FROM (
    SELECT s.*, @rownum := @rownum + 1 AS rank 
    FROM scores s, 
     (SELECT @rownum := 0) r 
    ORDER BY score DESC, duration DESC, time) `selection` 
LEFT JOIN accounts a ON a.id=user_id 
WHERE rank >= 0 && rank <= 10 && a.age>=18 && a.age<=35 && a.gender='m' 

이 쿼리 순위 3, 5, 8, 9, 11 대신 1, 2, 3, 4 등 , 5

id, username, country는 관련없는 데이터이고 테이블 아래로 계속 반복되기 때문에 모두 생략되었습니다. 연령대는 '34'로 상태가 표시되는 것과 마찬가지로 34 세의 나이에이 사용자가 유일하기 때문에 국가와 사용자 이름이 동일합니다.

첫 번째로 적절한 순위와 위의 쿼리하지만 잘못 분류 점수 (데이터베이스에 추가 된로 IE 같은 순서.) : 위에서

age | score | rank 
-------------------- 
    34 | 5 | 1 
    34 | 1 | 2 
    34 | 22 | 3 
    34 | 13 | 4 
    34 | 23 | 5 
    34 | 23 | 6 
    34 | 34 | 7 
    34 | 32 | 8 
    34 | 58 | 9 
    34 | 76 | 10 

두 번째 쿼리는 제대로 정렬하지만 여전히 고려하여 다른 사용자를 취할 랭크 순위를 매길 때 최종 결과에서 제외됩니다.

age | score | rank 
--------------------- 
    34 | 76 | 3 --- This should have started at 1 
    34 | 62 | 4 
    34 | 58 | 5 
    34 | 42 | 7 --- Notice 6 was skipped 
    34 | 34 | 8 
    34 | 32 | 9 
    34 | 29 | 10 

나는 무엇을 기대 :

age | score | rank 
-------------------- 
    34 | 76 | 1 
    34 | 62 | 2 
    34 | 58 | 3 
    34 | 42 | 4 
    34 | 34 | 5 
    34 | 32 | 6 
    34 | 29 | 7 
+0

당신이 당신의 예상 출력과 함께 테이블에 대한 일부 샘플 데이터를 포함시겠습니까? –

+0

@TimBiegeleisen 안녕하세요. Tim, 언급 해 주셔서 감사합니다. 내 서버에서 샘플 데이터를 추가했습니다. –

+0

여러 테이블이 있지만 하나의 테이블에 대한 데이터 만 표시했습니다. –

답변

0

내가 샘플 데이터 집합을 기반으로 다음 쿼리를 제공 할 수 있습니다 :

SET @rank = 0; 
SET @score = NULL; 

SELECT 
    age, 
    @rank:=CASE WHEN @score = score THEN @rank ELSE @rank + 1 END AS rank, 
    @score:=score AS score 
FROM scores 
ORDER BY rank; 

(가) 정의의 관점에서, 점수의 순위를 계산하는 "순위에 대한 "일반적으로 사용됩니다. 두 점수가 같으면 순위가 같습니다. 행 번호가 실제로 필요한 경우 위 쿼리를 쉽게 수정할 수 있습니다.

출력 : 여기

enter image description here

데모 :

Rextester