Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于行数据的Mysql跨模式查询_Sql_Mysql - Fatal编程技术网

基于行数据的Mysql跨模式查询

基于行数据的Mysql跨模式查询,sql,mysql,Sql,Mysql,因此,我正在开发一个web应用程序,我们的客户希望他们的用户数据与其他客户的用户数据分离。由于我们的客户机可以相互协作,我们不能只为每个客户机创建一个新的应用程序实例,因为我们必须确保用户ID匹配并且在客户机之间是唯一的 基本上是我们的“MasterApplication”数据库,它有一个“User”表,其中包含一个UserId和数据库的名称,在其中可以找到剩余的用户数据。每个客户机都有自己的数据库用户,该用户只能访问“MasterApplication”和自己的客户机表 下面是一个它看起来如何

因此,我正在开发一个web应用程序,我们的客户希望他们的用户数据与其他客户的用户数据分离。由于我们的客户机可以相互协作,我们不能只为每个客户机创建一个新的应用程序实例,因为我们必须确保用户ID匹配并且在客户机之间是唯一的

基本上是我们的“MasterApplication”数据库,它有一个“User”表,其中包含一个UserId和数据库的名称,在其中可以找到剩余的用户数据。每个客户机都有自己的数据库用户,该用户只能访问“MasterApplication”和自己的客户机表

下面是一个它看起来如何的例子

CREATE DATABASE MasterDatabase
CREATE DATABASE Client1
CREATE DATABASE Client2

CREATE TABLE `MasterDatabase`.`Person` (
  `PersonId` INT NOT NULL AUTO_INCREMENT,
  `DatabaseName` Varchar(20) NOT NULL,
  PRIMARY KEY (`PersonId`)
)

CREATE TABLE `Client1`.`Person` (
      `PersonId` INT NOT NULL,
      `FirstName` Varchar(20) NOT NULL,
      PRIMARY KEY (`PersonId`)
    )

CREATE TABLE `Client2`.`Person` (
     `PersonId` INT NOT NULL,
     `FirstName` Varchar(20) NOT NULL,
      PRIMARY KEY (`PersonId`)
)

INSERT INTO MasterDatabase.Person VALUES (1, 'Client1');
INSERT INTO MasterDatabase.Person VALUES (2, 'Client2');

INSERT INTO Client1.Person VALUES (1, 'Matt');
INSERT INTO Client2.Person VALUES (2, 'Scott');
所以Client1将有一个数据库用户,可以访问MasterDatabase和Client1表。Client2将有一个用户可以访问MasterDatabase和Client2

我希望有一种方法可以使用MasterDatabase中“DatabaseName”字段中的数据轻松地进行跨模式查询,但我想不出来。我知道,在大多数情况下,我可以将客户机的数据库名称存储在应用程序逻辑中,并将其插入查询中,但仍有一些地方需要将所有客户机连接到一个查询中

我的尝试是

SELECT *, `DatabaseName` INTO @DB FROM MasterDatabase.Person 
LEFT JOIN @DB.Person ON MasterDatabase.Person.PersonId = @DB.Person.PersonId

但这并没有像我希望的那样奏效。有没有什么方法可以通过手术来完成?如果您有任何客户机,我也愿意接受将每个客户机的用户数据分离出来的其他想法。

我认为您可以在存储过程中这样做。看起来像

DELIMITER //
CREATE DEFINER='root'@'localhost' PROCEDURE GetData(IN user_id INT)
BEGIN
  DECLARE db_name varchar(100);
  SELECT DatabaseName INTO db_name FROM MasterDatabase.Person WHERE  PersonId = user_id;
  SET @t1 =CONCAT('SELECT * FROM ',db_name,'.Person' );
  PREPARE stmt1 FROM @t1;
  EXECUTE stmt1;
END//

更新对不起,我忘了
解除分配准备stmt1;它应该在
执行stmt1之后

感谢您的回复,虽然这样可以获得1个用户,但我希望有一个解决方案,可以用一个函数/查询连接每个模式。我想我可以对每个用户进行循环,基本上做你所做的,但我认为这不是很有效。