2

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

  1. 第一个数据库已经在连接本身中定义。
  2. 第二个数据库必须从第一个数据库中的信息动态派生,该信息必须首先在用户定义的变量中定义。为简单起见,我将简单地将第二个数据库名称称为example2.
  3. 静态定义第二个数据库名称有效,并且所有JOINed 数据都已成功提取,但是如果我在实时(或“生产”)服务器上执行此操作,我将不得不在与某些 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在两个数据库之间创建表?

  • 所有数据均已正确存储/格式化/等。
  • 我已经让用户定义的变量工作了,我需要帮助在数据库到数据库的 JOIN 上实现它。
  • 这与 PHP 具有可变变量这一事实有关。
4

2 回答 2

2

在 MySQL 中,您可以使用准备好的语句,例如

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;
于 2020-08-18T12:17:52.780 回答
1

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

SET @db = 'example2';
EXECUTE IMMEDIATE CONCAT('SELECT * FROM example1 AS e1 INNER JOIN ', @db , '.accounts AS e2a ON e2a.id = e1.accounts_id');
于 2020-08-18T13:49:12.520 回答