mysql - 基于另一个表列值的动态表连接?

标签 mysql sql left-join

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

服务器(表 1):

编号 |游戏 |标题

Servers_1(表 2,选项 1):

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

Servers_2(表 2,选项 2):

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

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

最佳答案

一种选择是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/Game 都应该是唯一的,并且只有 1 个不会为 NULL:

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

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

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

关于mysql - 基于另一个表列值的动态表连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15182300/

相关文章:

MySQL LIKE 查询和相关结果

mysql - 根据分数创建独特的排名然后用 MySQL 杀死

mysql - 如何在 MYSQL 服务器中使 UTC 时间和 unix 时间匹配?

java - 从数据库中获取大值

java - 如何将 jdbc 连接器连接到 MySql 数据库服务器?

mysql 查询 - 为一个巨大的表优化现有的 MAX-MIN 查询

java - 即使条件为真也无法进入 while 循环

sql-server - 查询忽略 WHERE 子句中的过滤

mysql - 对于所有项目计数,左连接所有日期的意外结果

mysql - 当我使用 left join 和 group by 时,sum 不起作用