3

我试图弄清楚是否有一种简单的方法可以使用mysql根据第一个表的列值动态加载第二个表

服务器(表 1):

身份证 | 游戏 | 标题

Servers_1(表 2,选项 1):

server_id(链接到servers.id)| 游戏版本 | 球员 | 插件

Servers_2(表 2,选项 2):

server_id(链接到servers.id)| 游戏版本 | 球员 | 模组 | 游戏地图

服务器_等。(表 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'
4

1 回答 1

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

而不是 using CASE,您可能只使用COALESCE每个 Id/Game 应该是唯一的,并且只有 1 不会为 NULL:

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

如果同一个服务器 ID 不可能出现在多个表中,那么您可以将 AND S.Game... 排除在 LEFT JOIN 之外,因为不再需要它。取决于您的唯一键。

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

于 2013-03-03T04:04:00.297 回答