2016-11-02 2 views
1

쿼리를 작성하려고하는데 이미 stackof에서 대답을 찾았지만 내 요구 사항과 일치하는 항목을 찾지 못했습니다. "nickname"및 "score"라는 두 개의 열이있는 player라는 테이블이 있습니다. 내가 최고 5 플레이어 얻기 위해이 쿼리를 사용특정 플레이어 SQL 쿼리의 순위를 선택하십시오.

SELECT nickname, score 
FROM player 
ORDER BY score DESC LIMIT 5; 

을 내가 대답으로이있어 : 나는 하나의 플레이어의 순위를 가지고 싶습니다 이제

nickname - score:  
zod  - 30 
ciao  - 20 
jiji  - 20 
mayina - 20  
jon  - 0. 

,하자 "jiji"라고 말하고 3을 결과로 얻습니다. 그 이유는 목록에서 세 번째 결과이기 때문입니다.

나는

SELECT COUNT(*) AS rank 
FROM player 
WHERE score >= (SELECT score FROM player WHERE nickname = 'jiji') 

처럼 많은 쿼리를 시도했지만 그들은 항상 "지지 통신"또는 "챠오"해당 테이블의 점수로 (20)를 얻을 마지막으로 플레이어의 순위 인 4를 반환합니다.

대신 "jiji"로 3을 얻을 수 있습니까? 고맙습니다. 이 점수 관계의 경우에는 안정되지 않는 약

SET @rank=0; 
SELECT * 
FROM (SELECT @rank:[email protected]+1, nickname, score 
    FROM player 
    ORDER BY score 
    DESC) AS t 
WHERE t.nickname = 'jiji'; 

올바른 코멘트 :

+0

질문에 태그를 지정할 때주의하십시오. 이것은 분명히 mysql과 sql-server가 아닙니다. 이것들은 같은 것이 아닙니다. –

+0

당신은 이상한 문제를 해결하기 위해 분석 기능을 사용할 필요가 있습니다 – Teja

+0

여기를보세요 : http://stackoverflow.com/questions/2520357/mysql-get-row-number-on-select – Galz

답변

1

일반적으로 사용되는 정의를 사용하여 순위 jiji에 대한 다음과 같습니다

SELECT count(*) + 1 AS rank 
FROM player 
WHERE score > (SELECT score FROM player WHERE nickname = 'jiji'); 

이 반환 " 2 "가됩니다.

안정적이고 각 행마다 다른 순위를 유지하려면 추가 키가 필요합니다. 명백한 키 (이 경우)는 nickname :

SELECT count(*) AS rank 
FROM player p CROSS JOIN 
    (SELECT score FROM player WHERE nickname = 'jiji') s 
WHERE p.score > s.score or 
     (p.score = s.score and p.nickname <= 'jiji'); 
+0

이것은 실제로 내가 시도한 것입니다. (고맙습니다.)하지만 phpmyadmin이 알파벳 순서 (별명) 첫 번째 쿼리를 할 때 그래서 .. 어떻게이 별명, 점수 플레이어에서 ORDER BY score DESC LIMIT 5' 쿼리를 얻을 수 있습니까? 별명의 알파벳 순서에 따라 주문 하시겠습니까? (나는 이것을 극복하려고 노력하고있는 이래로 시간이 있었기 때문에 약간 혼란 스럽다. 미안 ..) –

3

이보십시오. 그것은 안정, 우리가 정렬을 변경할 수 있습니다 점수를 만들었 다음 별명을 기반으로하는 :

SELECT * 
FROM (SELECT @rank:[email protected]+1, nickname, score 
    FROM player 
    ORDER BY score, nickname 
    DESC) AS t 
WHERE t.nickname = 'jiji'; 
+0

방금 ​​다시 확인하기 전에 동일한 쿼리를 사용하여이 작업을했습니다 (감사합니다!) 하지만 이제는 PHP에서이 쿼리를 사용하면서 두 개의 별도 쿼리를 만들어야합니다. @ rank = 0'을 설정하고 나머지는 나머지를 위해. 두 번째 쿼리에서 이렇게하려고하면 다음과 같이 표시됩니다. "오류. '필드 목록'에서 알 수없는 열 'rank' –

+0

사용중인 코드 : '$ querysetRank ="@rank = 0 "설정 { $ queryPlayerRank = "SELECT rank FROM (순위 랜덤 : 순위 = 1 순위, 스코어 내림차순 별칭)에서 pl.nickname ($ result = mysqli_query $ 데이터베이스, $ querysetRank) = '$ 별명' "(! ($ resultZ = mysqli_query ($ 데이터베이스, $ queryPlayerRank))) 다른 // 오류 경우 // 나는 당신이 두 쿼리를 실행해야합니다 필요가 있다고 생각 things' –

+0

@JulsA을 동일한 세션에서 '@ rank'를 두 번째 쿼리에서 사용할 수 있습니다. – Galz

관련 문제