2011-01-09 90 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将帮助在性能上