2010-04-15 3 views
1

SQL 쿼리 경험이 너무 적기 때문에 다소 복잡한 쿼리를 작성해야 할 때 SQL 쿼리를 사용하는 것이 부끄럽다. SQL 전문가의 조언.SQL - 하나의 테이블에 여러 개의 조인 - 두 개의 키로 된 두 개의 값

은 기본적으로 내가 같은 결과 집합에 반환하는 쿼리를 구성하고자하는 다음

games(game_id, game_date, player_a_id, player_a_score, player_b_id, player_b_score) 
players(player_id, player_name) 

와 유사한 두 개의 테이블을 가지고, 플레이어 이름과 점수는 즉. 내가 좋아하는 것 내 순진 접근 방식은

select games.game_id, games.game_date, (select player_name from players where player_id = games.player_a_id), games.player_a_score, (select player_name from players where player_id = games.player_b_id), games.player_b_score) 

사람이 저에게이 접근하는 가장 좋은 방법을 조언 해 줄 수 있습니다 최적화되어

GAME_ID, game_date, player_a_name, player_a_score, player_b_name, player_b_score 여기

?

감사합니다. 이 같은

답변

2

아마 뭔가 : 내부는 왼쪽 조인보다 더 효율적입니다 가입 이유

select 
    games.game_id, 
    games.game_date, 
    pa.player_name as 'player_a_name', 
    games.player_a_score, 
    pb.player_name as 'player_b_name', 
    games.player_b_score 
from games 
inner join players pa on (games.player_a_id = pa.player_id) 
inner join players pb on (games.player_b_id = pb.player_id) 
+0

당신은 설명 할 수 있습니까? – adam

+0

player_a_id가 null이거나 player_b_id가 null 인 경우는 어떻게됩니까? 이 문장은 그 게임을 선택하지 않습니다. – mphair

+1

나는 player_a_id 및 player_b_id가 null이 될 수 없다고 추측하고 있었다고 생각합니다. 그 중 하나가 null 인 경우, 어떻게/왜 점수가있는 게임 기록이 있습니까? –

2
SELECT 
    g.game_id, g.game_date, 
    pa.player_name, g.player_a_score, 
    pb.player_name, g.player_b_score 
FROM games g 
LEFT JOIN player pa ON (pa.player_id=g.player_a_id) 
LEFT JOIN player pb ON (pb.player_id=g.player_b_id) 
+0

왜 왼쪽 조인이 내조 조보다 더 효율적인지 설명 할 수 있습니까? – adam

+0

"EXPLAIN"을 사용하여 각각의 경우에 무엇을 할 것인지 MySQL에 요청하십시오. 나는 간단한 대답이 있다고 생각하지 않는다. 나는 LEFT JOIN을 사용한다. 왜냐하면 내가 원하는 것을 시각화하는 것이 더 쉽기 때문이다. 여기 (완전히 다른 결과로) 몇 가지 관련 링크입니다 : 1. http://stackoverflow.com/questions/186071/left-join-outperforming-inner-join 2. HTTP : //forums.mysql .com/read.php? 24,205080 – dkamins

관련 문제