2011-11-11 3 views
0

j'ai 3 tables qui ressemble à ceci:comment effectuer de sélection de plusieurs tables par plusieurs ids

game_table 
+---------+------------+------------+----------------------+----------+ 
| game_id | game_title | sponser_id | game expiration date | prize_id | 
+---------+------------+------------+----------------------+----------+ 
prize_table 
+----------+---------------------------+------------+-------------+--------------------+--------------------------------------------+ 
| prize_id | prize_image_name   | prize_cost | prize_title | remaining_quantity | prize_description       | 
+----------+---------------------------+------------+-------------+--------------------+--------------------------------------------+ 
sponser_table 
+------------+--------------+ 
| sponser_id | sponser_name | 
+------------+--------------+ 

Comment construire requête sélectionner toutes les données des 3 tables qui la viande la déclaration qui vont de quelque chose comme le code pseudo:

select all data from game_table and prize_table and sponser_table where game_table.sponser_id = 2 and game_table.prize_id = 2 

J'ai essayé quelque chose comme ceci:

SELECT game_list.*, prize_list.* ,sponser_list.* FROM game_list, prize_list,sponser_list 
WHERE game_list.sponser_id=2 And game_list.prize_id = 2 And game_list.game_id=2 ; 

mais ça ne m'a pas donné de bons résultats.

Répondre

1

Vous aviez une clause WHERE à limiter aux ID corrects, mais vous n'aviez aucune condition de jointure pour lier vos tables. Au lieu de la syntaxe de jointure implicite vous tentiez (liste des tables séparés par des virgules), utilisez un JOIN explicite s avec des colonnes relatives a déclaré:

SELECT 
    game_list.*, 
    prize_list.* , 
    sponser_list.* 
FROM 
    game_list 
    JOIN prize_list ON game_list.prize_id = prize_list.prize_id 
    JOIN sponser_list ON game_list.sponser_id = sponser_list.sponser_id 
WHERE game_list.sponser_id=2 And game_list.prize_id = 2 And game_list.game_id=2 ; 

Je recommande contre la sélection de toutes les colonnes de chaque table mais, puisque vous dupliquez la id des colonnes dans au moins deux endroits. Au lieu de cela, soyez explicite sur les colonnes que vous voulez. Cela vous aidera également si vous ajoutez ultérieurement des colonnes supplémentaires à ces tables qui ne doivent pas être incluses dans cette requête.

SELECT 
    game_id, 
    game_title, 
    game_list.sponser_id, 
    game_expiration_date, 
    game_list.prize_id, 
    prize_image_name, 
    prize_cost, 
    prize_title, 
    remaining_quantity, 
    prize_description, 
    sponser_name  
FROM 
    game_list 
    JOIN prize_list ON game_list.prize_id = prize_list.prize_id 
    JOIN sponser_list ON game_list.sponser_id = sponser_list.sponser_id 
WHERE game_list.sponser_id=2 And game_list.prize_id = 2 And game_list.game_id=2 ; 
0
SELECT 
    game_list.*, prize_list.* ,sponser_list.* 
FROM game_list 
JOIN prize_list ON game_list.prize_id = prize_list.prize_id 
JOIN sponser_list ON game_list.sponser_id = sponser_list.sponser_id 
WHERE 
    game_list.sponser_id=2 And game_list.prize_id = 2 And game_list.game_id=2 ; 
0

D'après votre description, il semble que les tableaux peuvent être liés. Si elles sont, vous devez utiliser une jointure, comme ceci:

SELECT * 
FROM game_table g 
LEFT OUTER JOIN prize_table p ON p.prize_id=g.prize_id 
LEFT OUTER JOIN sponser_table s ON s.sponser_id=g.sponser_id 
WHERE g.game_id=2 
+0

Pourquoi utiliser une jointure externe gauche? – Romain

+0

Les informations dans la question ne sont pas suffisantes pour déterminer si un jeu doit avoir à la fois un sponsor et un prix ou non. La jointure interne peut masquer une ligne de jeu s'il n'y a pas de prix ou de sponsor, ce qui pourrait créer de la confusion chez les développeurs qui découvrent le SGBDR. C'est pourquoi je suggère d'utiliser une jointure externe. – dasblinkenlight

+0

Je suppose qu'il y a des données dans les trois tables et que j'utilise une jointure interne, pour des raisons de performances, puis ajoutez un commentaire disant qu'il faut utiliser des jointures externes si certaines tables ne peuvent pas avoir de données associées. Puisque le PO mentionne un filtre sur chacune des tables, je suppose que tous devraient avoir des données de toute façon. – Romain

1
SELECT * 
FROM game_table 
JOIN prize_table USING (prize_id) 
JOIN sponser_table USING (sponser_id) 
WHERE sponser_id = 2 
AND prize_id = 2 
AND game_id = 2 
Questions connexes