2013-03-03 83 views
3

我试图找出是否有一种简单的方式动态地加载基于所述第一表的列值的第二表与MySQL基于另一个表列值的动态表连接?

服务器(表1):

ID |游戏|标题

Servers_1(表2,选项1):

SERVER_ID(链接servers.id)| game_version |玩家|插件

Servers_2(表2,选项2):

SERVER_ID(链接servers.id)| game_version |玩家| mods | game_map

Servers_etc。 (表2,选项等)

试图找出如何做类似

left_join servers_[servers.game] on servers.id = servers_[servers.game].server_id 

所以它会抓住servers.game的价值,并用它来完成的表名。如果这是不可能的,则是一个case语句可能如:

Left_Join 
    if (servers.game == 1) 'servers_1' 
    elseif (servers.game == 2) 'servers_2' 
    elseif (servers.game == 3) 'servers_3' 
+0

看看下面是否有帮助:http://rpbouman.blogspot.com/2005/11/mysql-5-prepared-statement-syntax-and.html – 2013-03-03 04:02:44

回答

2

一种选择将是LEFT JOIN每个表,并使用CASE语句返回相应的数据。

像这样的东西应该帮助你开始:

SELECT S.Id, S.Game, S.Title, 
    CASE S.Game 
     WHEN 1 THEN S1.game_version 
     WHEN 2 THEN S2.game_version 
    END game_version, 
    ... 
FROM Servers S 
    LEFT JOIN Servers_1 S1 ON S.id = S1.Server_Id AND S.Game = 1 
    LEFT JOIN Servers_2 S2 ON S.id = S2.Server_Id AND S.Game = 2 

而不是使用CASE的,你很可能只是用COALESCE每个ID /游戏应该是唯一的,只有1就不会是空:

SELECT COALESCE(S1.game_version,S2.game_version,...) game_version 

如果没有办法,同一个服务器ID可以在多个表中,那么您可以将AND S.Game ...离开LEFT JOIN,因为它不再需要。取决于你独特的钥匙。

或者,您可以使用动态SQL。

相关问题