使用用户定义的变量将第二个数据库动态命名为该第二个数据库的JOIN表

问题描述

我需要JOIN两个已经静态完成的数据库,仅供测试。

  1. 一个数据库已在连接本身中定义。
  2. 第二个数据库必须从第一个数据库中必须首先在用户定义的变量中定义的信息动态派生。为简单起见,我将第二个数据库名称简称为example2
  3. 静态定义第二个数据库名称有效,并且如果我在实时(或“生产”)服务器上执行此操作,则以我目前的理解可成功提取所有JOIN数据则必须在同一连接上运行两个单独的查询,并在两个查询之间添加一些PHP代码
  4. 在不运行第二个查询的情况下,我无法定义第二个数据库名称,关键是要避免在我知道有一个方法可以在单个查询中进行多次连接的情况下(如果不计算设置)用户定义的变量(查询)。

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

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 ','.accounts AS e2a ON e2a.id = e1.accounts_id');

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...