2011-12-27 5 views
0

j'ai table de requête mysql deux tables, des jeux et les utilisateurs établissent avec les champs suivants:rejoindre

tblGAMES--> 
GAME_ID (int) primary key, 
P1_ID (int), 
P2_ID (int), 
P3_ID (int), 
P4_ID (int) 

tblUSERS--> 
USER_ID (int) primary key, 
FIRST_NAME (text), 
LAST_NAME (text) 

Je suis Interrogation ma base de données pour imprimer les détails de chaque ligne de jeu. Exemple:

GAME_ID:1, P1:1, P2:2, P3:3, P4:4 

mais au lieu d'imprimer l'identifiant qui est stocké dans tblGAMES je voudrais imprimer le premier nom de chaque joueur tel qu'il apparaît dans la ligne correspondante dans tblUsers. est-ce faisable en utilisant une seule requête par opposition aux requêtes mulitple?

end result-->GAME_ID:1, P1:David, P2:Paul, P3:John, P4:Bobby 

Répondre

1

Vous devez joindre à la table des utilisateurs 4 fois ...

select g.GAME_ID, 
     u1.FIRST_NAME as ulname, 
     u2.FIRST_NAME as u2name, 
     u3.FIRST_NAME as u3name, 
     u4.FIRST_NAME as u4name 
from tblGAMES as g 
    left join tblUSERS as u1 on g.P1_ID =u1.USER_ID 
    left join tblUSERS as u2 on g.P2_ID =u2.USER_ID 
    left join tblUSERS as u3 on g.P3_ID =u3.USER_ID 
    left join tblUSERS as u4 on g.P4_ID =u4.USER_ID 

(non testé)

1

Dans la requête que vous allez vouloir faire référence tblUSERS une fois par JOIN . Quelque chose comme ceci:

SELECT 
    tblGAMES.GAME_ID, 
    tblUSER1.FIRST_NAME AS P1, 
    tblUSER2.FIRST_NAME AS P2, 
    tblUSER3.FIRST_NAME AS P3, 
    tblUSER4.FIRST_NAME AS P4 
FROM tblGAMES 
    INNER JOIN tblUSERS AS tblUSER1 ON tblGAMES.P1_ID = tblUSER1.USER_ID 
    INNER JOIN tblUSERS AS tblUSER2 ON tblGAMES.P2_ID = tblUSER2.USER_ID 
    INNER JOIN tblUSERS AS tblUSER3 ON tblGAMES.P3_ID = tblUSER3.USER_ID 
    INNER JOIN tblUSERS AS tblUSER4 ON tblGAMES.P4_ID = tblUSER4.USER_ID 

Notez que ma syntaxe peut avoir besoin d'un peu de peaufinage, je n'ai pas assez MySQL récemment écrit pour libérer la main de manière fiable à 100%. Mais vous avez l'idée. Chaque jointure est ajoutée au produit global indépendamment.

Vous pouvez également modifier les types JOIN en fonction des besoins de chaque lecteur. Par exemple, si certains jeux sont à 2 joueurs, vous voudriez que ceux-ci soient LEFT OUTER JOIN à la place afin de mieux gérer les valeurs null, etc.