问题描述
我需要JOIN
两个已经静态完成的数据库,仅供测试。
- 第一个数据库已在连接本身中定义。
- 第二个数据库必须从第一个数据库中必须首先在用户定义的变量中定义的信息动态派生。为简单起见,我将第二个数据库名称简称为
example2
。 - 静态定义第二个数据库名称有效,并且如果我在实时(或“生产”)服务器上执行此操作,则以我目前的理解可成功提取所有
JOIN
数据则必须在同一连接上运行两个单独的查询,并在两个查询之间添加一些PHP代码。 - 在不运行第二个查询的情况下,我无法定义第二个数据库名称,关键是要避免在我知道有一个方法可以在单个查询中进行多次连接的情况下(如果不计算设置)用户定义的变量(查询)。
这是对我有用的静态演示:
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具有variable variables的事实有关。
解决方法
在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 ','.accounts AS e2a ON e2a.id = e1.accounts_id');