2011-11-11 34 views
0

我有3個表,看起來像這樣執行從多個表中選擇:如何通過幾個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 | 
+------------+--------------+ 

如何建立查詢選擇從3個表中的所有數據 肉去的東西的聲明像僞代碼:

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

我想是這樣的:

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 ; 

,但它沒有給我帶來好的結果。

回答

1

你有一個WHERE子句來限制正確的ID,但是你沒有連接條件來關聯你的表。取而代之的是隱式連接語法的你試圖(以逗號分隔的表列表),使用一個明確的JOIN s的陳述與列:

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 ; 

我不推薦,雖然選擇來自各表中的所有列,因爲要複製的在至少兩個地方的id列。相反,要明確你想要的列。如果稍後向這些查詢中不應包含的表添加其他列,這也將對您有所幫助。

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

從你的描述看來,該表可能有關。如果是這樣,你需要使用一個連接,像這樣:

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

爲什麼要使用一個左外連接? – Romain

+0

問題中的信息不足以確定遊戲是否必須同時擁有贊助商和獎品。如果沒有獎品或贊助商,內部加入可能會隱藏遊戲行,這可能會讓開發人員對RDBMS感到困惑。這就是爲什麼我建議使用外連接。 – dasblinkenlight

+0

我會假設所有三個表中都有數據,並且出於性能方面的原因使用內部聯接,然後可能會添加一條評論,說如果某些表不能有相關數據,應該使用外部聯接。由於OP在每個表格上都提到了一個過濾器,所以我會假設所有的數據都會有數據。 – 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