2009-02-18 77 views
1

我正在設計一個網站來教我自己如何在mysql中使用表連接,並在早期卡住了。 (這些數字是Wii的朋友代碼,如果這能幫助你理解這一點!)簡單的Mysql表連接問題

我有3個表:

用戶:

id, firstname, surname 

遊戲:

id, title 

號:

number, users_id, game_id 

T他的號碼是屬於用戶且與遊戲關聯的唯一代碼。

我想弄出一個特定遊戲的數字列表以及它們所屬的用戶的名字。

我運行查詢:

SELECT firstname, surname, number FROM games, users, numbers WHERE numbers.game_id = games.id AND games.title = 'foogame' 

例如,獲得了所有屬於foogame的數字。但是,這會返回沒有此遊戲代碼的任何用戶使用來自其他用戶的隨機代碼。我如何使這個查詢只返回實際上有該遊戲代碼的用戶?

回答

9

我覺得它更容易,如果你實際使用聯接,因爲你不會錯過像你第一次做的一樣加入條件。

SELECT firstname, surname, number 
FROM users u 
INNER JOIN numbers n 
    on n.users_id = u.id 
INNER JOIN games g 
    on n.game_id = g.id 
WHERE g.title = 'foogame' 

INNER JOIN是你做了什麼,相當於 - 它明確限制。

0

啊 - 只是寫這個問題幫助了我!

SELECT firstname, surname, number 
FROM games, users, numbers 
WHERE numbers.game_id = games.id AND 
     games.title = 'foogame' AND 
     games.user_id = users.id 

簡單!

優化此任何想法?

+0

你在做什麼在你的例子是笛卡爾乘積(所有行交叉針對來自其他表的行的所有其他組合)。您希望在id列上使用連接來減少數據集,然後再擊中「where」子句。 – 2009-02-18 21:35:13

+0

@Andrew:大多數RDBMS品牌知道如何相同地優化這兩種情況。如果你不*在where子句中添加條件,它只是一個笛卡爾積。 – 2009-02-18 21:40:34

1
SELECT firstname, surname, number 
FROM games g, numbers n, users u 
WHERE g.title = 'foogame' 
    AND n.game_id = g.id 
    AND u.id = n.users_id 

要進行優化,創建索引:

CREATE INDEX ix_game_title ON games (title) 

CREATE INDEX ix_numbers_game ON numbers (game_id, users_id) 

,當然,讓你games.idusers.id主鍵。

如果你曾經想在給予一定user所有games搜索numbers,您還需要:

CREATE INDEX ix_numbers_users ON numbers (users_id) 
0

您需要將numbers表的users_idgame_id列鏈接到用戶和遊戲ID欄。 只需添加:

AND users_id = users.id 
AND game_id = games.id 

你也可以使用一個JOIN來代替。

0

要跟進Tom的回答......如果你是MySQL的新手,我建議你逐步分解它,並且非常清楚從哪裏抓取什麼東西。您可以將它視爲兩個表格的連接,其中第三個點在其中跳躍。您還可以使用括號,在幾個月後回到它時允許分離。

SELECT firstname, surname, number 
    FROM 
    (
     (users u INNER JOIN numbers n ON(n.user_id = u.id)) 
     INNER JOIN games g ON(n.game_id = g.id) 
    ) 
    WHERE g.title = 'foogame' 
1

我建議先從一個變化開始。

甚至不要調用任何對象或屬性的「數字」。

在這種情況下,可能分別調用表格和列'game_code'和games_codes'。

那麼接下來:

SELECT firstname, surname, number 
FROM games, users, numbers 
WHERE numbers.game_id = games.id AND games.title = 'foogame' 

成爲

SELECT firstname, surname, game_code 
FROM games g, users u, game_codes gc 
WHERE gc.game_id = g.id AND g.title = 'foogame' 

,當然還有其他的聯接

AND gc.users_id = u.id