mysql - 如何从多个数据库动态获取数据?

标签 mysql

我在MySQL中有多个数据库来自不同的公司。 前任。

1.Company1
2.Company2
3.Company3
4.Company4

在每个数据库中,表和列的结构都是相同的,但数据是为不同的公司存储的。 现在,如果我必须获取不同公司的 EmployeeID 销售额计数,那么我需要编写如下查询。

    Select a.EmployeeID,Count(b.TransactionDate)
    From Company1.Employee as a
    Inner Join Company1.Sales as b
    On a.EmployeeID=b.EmployeeID
    Group By a.EmployeeID
Union
Select a.EmployeeID,Count(b.TransactionDate)
    From Company2.Employee as a
    Inner Join Company2.Sales as b
    On a.EmployeeID=b.EmployeeID
    Group By a.EmployeeID
Union
Select a.EmployeeID,Count(b.TransactionDate)
    From Company3.Employee as a
    Inner Join Company3.Sales as b
    On a.EmployeeID=b.EmployeeID
    Group By a.EmployeeID
Union
Select a.EmployeeID,Count(b.TransactionDate)
    From Company4.Employee as a
    Inner Join Company4.Sales as b
    On a.EmployeeID=b.EmployeeID
    Group By a.EmployeeID

请注意,我正在使用硬编码值更改“FROM”子句和“INNER JOIN”中的数据库。

将来可能会添加更多数据库,我不想更改后面的代码,或者我不想添加带有另一个“联盟”的代码。 我们可以做些什么来动态地做到这一点吗?我的意思是,如果我们可以将数据库名称存储在表中,并且查询应该自动从表中选取这些数据库信息。

最佳答案

我一直在等待点赞和致谢;)

有了这个数据库(当然它们都是一样的,所以我只发布其中一个。

use `company3`;
DROP TABLE  IF EXISTS Employee;
CREATE TABLE Employee
(`EmployeeID` int, `LastName` varchar(40), `Firstname` varchar(40), `Age` int)
;

INSERT INTO Employee
(`EmployeeID`, `LastName`, `Firstname`, `Age`)
VALUES
(1, 'Hansen', 'Han', 30),
(2, 'Svendson', 'Sven', 23),
(3, 'Pettersen', 'Peter', 20)
;
DROP TABLE  IF EXISTS Sales;
CREATE TABLE Sales
(`EmployeeID` int, `TransactionDate` datetime)
;

INSERT INTO Sales
(`EmployeeID`, `TransactionDate`)
VALUES
(1, '2015-12-20 10:01:00'),
(1, '2015-12-20 10:01:00'),
(2, '2015-12-20 10:01:00'),
(2, '2015-12-20 10:01:00'),
(2, '2015-12-20 10:01:00')
;

还有这个存储过程

CREATE DEFINER=`root`@`localhost` PROCEDURE `GetSakesConut`()
BEGIN
  DECLARE bDone INT;
  DECLARE DBname TEXT;
  DECLARE sqlstement LONGTEXT;
  DECLARE n INT;
  DECLARE curs CURSOR FOR  SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
      WHERE SCHEMA_NAME LIKE 'company%';
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1; 
  OPEN curs;

  SET bDone = 0;
  SET n =0;
  SET sqlstement  = '';
  SALESloop: LOOP
    FETCH curs INTO DBname; 
    IF bDone = 1 THEN
      LEAVE SALESloop;
    END IF;
    IF n>0  THEN
     SET sqlstement  = CONCAT(sqlstement,' UNION ');
    END IF;
    SET sqlstement  = CONCAT(sqlstement,'Select "',DBname,'",a.EmployeeID,');
    SET sqlstement  = CONCAT(sqlstement,'Count(b.TransactionDate) ');
    SET sqlstement  = CONCAT(sqlstement,'From ',DBname,'.Employee as a ');
    SET sqlstement  = CONCAT(sqlstement,'Inner Join ',DBname,'.Sales as b ');
    SET sqlstement  = CONCAT(sqlstement,'On a.EmployeeID=b.EmployeeID ');
    SET sqlstement  = CONCAT(sqlstement,'Group By a.EmployeeID ');
    SET n =n+1;   

  END LOOP SALESloop; 
  CLOSE curs;
  SET @sqlstement = sqlstement;
  PREPARE stmt FROM @sqlstement;
  EXECUTE stmt;
END

解释一下: 对于游标 curs,我获取所有以 compan 开头的数据库名称 在循环中,我得到一个又一个的数据 enzyme 名称,然后用它进行构建 您的 select 语句具有正确的数据库名称。 当然,您必须将联合添加到所有没有第一个的选择

您得到以下结果

company1   EmployeeID   Count(b.TransactionDate)
company1   1            2
company1   2            3
company2   1            2
company2   2            3
company3   1            2
company3   2            3

当然,我必须熟练使用 select 语句,因为你的语句无法正常工作。

关于mysql - 如何从多个数据库动态获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57526981/

相关文章:

php - 从 MySQL 数据库中选择随机条目

mysql - mysql如何比较LONG字符串内部

MySQL 返回不应该匹配的 WHERE 子句的结果

php - 用数据库记录填充文本区域

php - 提交时间戳到mysql

mysql - 加速 MySQL SELECT 查询但没有结果

mysql - 确保所有排列中 FK 唯一性的最佳方法是什么?

mysql - 无法启动 MySQL 服务器

mysql - 当数据为 0 时显示空白,否则 concat 函数中的值

mysql - Laravel QueryBuilder - 相同查询的 `where()` 和 `whereRaw()` 的不同结果