2011-01-09 33 views
0

好吧,我有5個表格,我需要從一個變量中獲取信息。MySQL:如何根據其他表中的信息從多個表中提取信息?

gameinfo 
id | name | platforminfoid 

gamerinfo 
id | name | contact | tag 

platforminfo 
id | name | abbreviation 

rosterinfo 
id | name | gameinfoid 

rosters 
id | gamerinfoid | rosterinfoid 

的1個變量將被gamerinfo.id,然後這將從gamerinfo拉所有相關數據,這將拉動從名冊的所有相關數據,這將拉動從rosterinfo所有相關數據,這將拉動所有相關數據來自gameinfo,然後將從platforminfo中提取所有相關數據。

基本上它打破了這樣的:

  • gamerinfo包含玩家基本 信息。
  • rosterinfo包含有關名冊 (即名稱和遊戲中的名冊 瞄向)
  • 名單包含了從玩家到 不同名冊實際的鏈接基本信息(玩家可以在 多個名冊)
  • 的GameInfo包含遊戲(即 名稱和平臺)
  • 平臺信息包含有關 不同平臺的遊戲 上播放信息的基本信息(這是可能的遊戲 ŧ Ø在多個平臺上扮演)

我非常新的SQL查詢涉及連接與聯合和這樣的,平時我只想把它分解成多個查詢,但我認爲必須有一個更好的辦法,所以後環顧網絡,我無法找到(或者我可能無法理解我在看什麼)我在找什麼。如果任何人都能指出我正確的方向,我將非常感激。

回答

3

一步一步查詢所需數據沒有任何問題。如果您在5個表中使用SQL中的JOIN,那麼我們確保在所有重要列上都有有用的索引。此外,這可能會產生大量重複數據:

想象一下:您需要來自gamerinfo的一條記錄,也許有3條gameinfo,4條名冊和其餘3條表中的3條。這將使你的1 * 3 * 4 * 3 * 3 = 108所記錄的結果,這將是這樣的:

ID Col2 Col3 
1  1  1 
1  1  2 
1  1  3 
1  2  1 
... ...  ... 

你可以看到,你會108次取ID,即使你只需要它曾經。所以我的建議是堅持使用大多數單一的簡單查詢來獲取所需的數據。

1

沒有必要UNION只是多次join應該做的工作

 
SELECT gameinfo.id AS g_id, gameinfo.name AS g_name, platforminfoid.name AS p_name, platforminfoid.abbreviation AS p_abb, rosterinfo.name AS r_name 
FROM gameinfo 
LEFT JOIN platforminfo ON gameinfo.platforminfoid = platforminfo.id 
LEFT JOIN rosters ON rosters.gameinfoid = gameinfo.id 
LEFT JOIN rosterinfo ON rosterinfo.id = rosters.rosterinfoid 

WHERE gameinfo.id = XXXX 

這應該拉約遊戲中的所有信息基於遊戲ID 索引上的所有ID(S)gameinfoid,platformid,rosterinfoid將幫助在性能上