基于行数据的Mysql跨模式查询
因此,我正在开发一个web应用程序,我们的客户希望他们的用户数据与其他客户的用户数据分离。由于我们的客户机可以相互协作,我们不能只为每个客户机创建一个新的应用程序实例,因为我们必须确保用户ID匹配并且在客户机之间是唯一的 基本上是我们的“MasterApplication”数据库,它有一个“User”表,其中包含一个UserId和数据库的名称,在其中可以找到剩余的用户数据。每个客户机都有自己的数据库用户,该用户只能访问“MasterApplication”和自己的客户机表 下面是一个它看起来如何的例子基于行数据的Mysql跨模式查询,sql,mysql,Sql,Mysql,因此,我正在开发一个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个用户,但我希望有一个解决方案,可以用一个函数/查询连接每个模式。我想我可以对每个用户进行循环,基本上做你所做的,但我认为这不是很有效。