2012-03-02 2 views
0
나는 테이블있어

받기 :이 열이 여러 열에서 가장 높은 값과 관련된 이름 열

id | player1_name | player1_score | player2_name | player2_score | player3_name | player3_score | player4_name | player4_score | player5_name | player5_score 

는 단일 행을 감안할 때, 어떻게 가장 높은 playerX_score와 해당 playerX_name을받을 수 있나요?

GREATEST()을 사용해 보았지만 playerX_name을 얻을 수 없습니다.

답변

1

제 생각에는 귀하의 테이블은 id | name | score | position | teamid으로 더 잘 설계 될 것이며, position은 1에서 5로, teamid은 같은 팀의 모든 사람들을 함께 그룹화하는 역할을한다고 생각합니다. 그것은 이런 종류의 쿼리를 훨씬 쉽게 만들 것입니다 (관련 행을 가진 팀 당 최대 점수).

SELECT GREATEST(player1_score,player2_score,player3_score, 
       player4_score,player5_score) as score, 
     CASE GREATEST(...) -- repeat the above 
     WHEN player1_score then player1_name 
     WHEN player2_score then player2_name 
     WHEN player3_score then player3_name 
     WHEN player4_score then player4_name 
     WHEN player5_score then player5_name 
     END as name 
FROM mytable 
+0

I을 또한 테이블 구조를 변경하는 것이 올바른 생각이라고 생각하지만 대체 솔루션을 게시하는 데 감사드립니다. 필자는 PHP/Python을 통해 SQL과 인터페이싱하는 데 익숙해 져있어 SQL을 잊어 버리는 경향이 있습니다. – octern

0

내가 당신의 테이블 구조는 당신이 뭘하려는 건지 적합하지 생각 :

그러나, 여기 당신이 당신의 현재 테이블에 원하는 것을 할 수있는 하나의 방법이다. 데이터베이스에 player1_nameplayer1_score 사이에 어떤 관계가 있다는 것을 알기를 원하지만 테이블에는 인코딩되어 있지 않습니다. 이 작업을 훨씬 쉽게 수행 할 수있는 변경은 각 플레이어에게 자신의 기록을 제공하고 어떤 플레이어가 함께 사용하는지 표시하기 위해 현재 id (특정 게임의 ID라고 가정)을 사용하는 것입니다.

그것은 다음과 같이 보일 것이다, 그리고

game_id | player_num | player_name | score 
1  | 1   | Octern  | 100 
1  | 2   | Boris  | 400 
1  | 3   | Jarlsberg | 300 
1  | 4   | Pete  | 40000 
... 

을 해당 게임에 대한 높은 득점을 찾기 위해 (이 경우, 게임 # 1), 당신은 말할 것 :

select player_name from scores 
    WHERE game_id = 1 
    ORDER BY score desc 
    LIMIT 1 
관련 문제