使用用户定义的变量动态命名第二个数据库以与第二个数据库连接表

Use a user-defined variable to dynamically name second database to JOIN tables with that second database

我需要JOIN两个我已经静态完成的不同数据库,仅用于测试目的。

  1. 第一个数据库已在连接本身中定义。
  2. 第二个数据库必须从第一个数据库中的信息动态派生,必须首先在用户定义的变量 中定义。为了简单起见,我将简单地将第二个数据库名称称为 example2.
  3. 静态定义第二个数据库名称有效,并且所有 JOINed 数据都被成功提取 但是 如果我在现场(或“ production") 服务器我必须在同一个连接上 运行 两个单独的查询,在这两个查询之间有一些 PHP 代码。
  4. 我无法在没有 运行 第二次查询的情况下定义第二个数据库名称,重点是在我知道有办法时避免与 SQL 服务器建立多个连接在单个查询中(如果我们不计算设置用户定义变量的查询)。

这是对我有用的静态演示:

SELECT * FROM example1 AS e1 
INNER JOIN example2.accounts AS e2a ON (e2a.id = e1.accounts_id);

但是以下不起作用:

SET @db = 'example2';
SELECT * FROM example1 AS e1 
INNER JOIN @db.accounts AS e2a ON (e2a.id = e1.accounts_id);

如何设置和使用用户定义的变量来动态定义第二个数据库的名称并使用它来动态JOIN两个数据库之间的表?

在MySQL中你可以像

一样使用Prepared Statements
SET @db = 'example2';
SET @sql = CONCAT('SELECT * FROM example1 AS e1 
                   INNER JOIN ', @db , 
                   '.accounts AS e2a ON e2a.id = e1.accounts_id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

为了避免第一个答案中客户端和服务器之间不必要的往返,这里有一个 2 班轮:

SET @db = 'example2';
EXECUTE IMMEDIATE CONCAT('SELECT * FROM example1 AS e1 INNER JOIN ', @db , '.accounts AS e2a ON e2a.id = e1.accounts_id');