MySQL数据库名称作为多个数据库之间查询的别名

时间:2017-05-18 09:10:57

标签: php mysql database

mysqli_query("SELECT login.validto,
(SELECT databases.databasename FROM DB1.databases WHERE databases.ID = login.ID ORDER BY databases.lastused DESC LIMIT 1) AS dbname, 
(SELECT users.username FROM dbname.users WHERE users.ID = '2') AS username
FROM DB1.login 
WHERE login.token = 'abc13def456';");

是否可以使用别名 dbname 作为子查询的数据库,而不是使用PHP的2个单独查询?

我使用1个数据库来处理所有登录,然后我们使用X数据库来保存所有客户数据,每个客户使用一个数据库,以后客户可以在数据库之间进行更改。

我得到了错误:

Error Code: 1142
SELECT command denied to user 'myMySQLuser'@'myMySQLhost' for table 'users'

dbname 更改为真实数据库名称可以正常工作, dbname 和真实数据库是相同的,但我想从我的1个查询而不是2个查询PHP脚本。

1 个答案:

答案 0 :(得分:0)

可以使用existing solution在MySQL服务器上创建一个procedure,它将从您的PHP应用程序中调用。

CREATE PROCEDURE my_proc()
BEGIN
  DECLARE @dbname, @username VARCHAR(25);
  # Set @dbname value
  SELECT databases.databasename INTO @dbname FROM DB1.databases WHERE databases.ID = login.ID ORDER BY databases.lastused DESC LIMIT 1;
  # Create query to set @username value from required database
  SET @user_query = CONCAT('SELECT users.username INTO @username FROM ', @dbname, '.users WHERE users.ID =2;');
  PREPARE stmt FROM @user_query;
  EXECUTE stmt; # set @username value
  DEALLOCATE PREPARE stmt;
  # Main query
  SELECT validto, @dbname, @username 
  FROM FROM DB1.login WHERE login.token = 'abc13def456';
END

您也可以使用所需的参数调用该过程。然后,您将能够使用简单的PHP语句来获取所需的数据。