2010-04-15 5 views
1

J'ai honte de dire que mon expérience SQL est si peu utilisée, elle tombe en panne quand je dois construire une requête légèrement complexe, donc j'apprécierais un SQL conseils d'experts.SQL - Joins multiples à une table - Deux valeurs à partir de deux clés

Essentiellement, j'ai deux tables, semblables à ce qui suit

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

Je souhaite construire une requête qui retourne dans le même jeu de résultats, les noms des joueurs et des scores à savoir.

game_id, game_date, player_a_name, player_a_score, player_b_name, player_b_score

Voici mon approche naïve que je voudrais optimiser

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) 

Quelqu'un peut-il me conseiller la meilleure façon d'aborder ce sujet?

Merci!

Répondre

2

Peut-être quelque chose comme ceci:

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

peut vous expliquer pourquoi une jointure interne sera plus efficace qu'une jointure gauche? – adam

+0

Qu'en est-il du cas où player_a_id est nul ou player_b_id est nul. Cette déclaration ne sélectionne pas ces jeux. – mphair

+1

Je suppose que je supposais que player_a_id et player_b_id ne peuvent pas être null. Si l'un d'entre eux était nul, comment/pourquoi auriez-vous un enregistrement de jeu avec des scores? –

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

pouvez-vous expliquer pourquoi une jointure gauche serait plus efficace qu'une jointure interne? – adam

+0

Utilisez "EXPLAIN" pour demander à MySQL ce qu'il prévoit de faire dans chaque cas. Je ne pense pas qu'il y ait une réponse simple. J'utilise normalement LEFT JOIN parce qu'il est plus facile (pour moi) de visualiser ce que je demande. Voici quelques liens pertinents (avec des résultats totalement différents): 1. http://stackoverflow.com/questions/186071/left-join-outperforming-inner-join 2. http: //forums.mysql .com/read.php? 24,205080 – dkamins

Questions connexes