2

我目前有一个存储主数据库的数据库服务器,并且该数据库中的表具有类似于下面的结构

公司.companyInfo

ID | Name     | databaseName | otherinfo
---+----------+--------------+----------
0  | companyA | databaseA    | Extra1
1  | companyB | databaseB    | Extra2

公司数据库如下

数据库A.users

userID | Name    | Password  |  extra
-------+---------+-----------+---------
0      | user1   | pass1     | other1
1      | user2   | pass2     | other2

和 databaseB 类似。

我想要做的是从用户表之一获取用户信息,但要从主数据库链接

所以我想做的是某种子选择来获取所有用户详细信息,但是将数据库名称提供给来自 Companies.companyInfo 表查询的子选择。

我被卡住了..请帮忙!

4

1 回答 1

2

目前尚不完全清楚您要追求什么,但原则上不能使用表达式(包括表查找中的字段值)作为标识符(例如表或列的名称)。

一种解决方法是从包含所需查询的字符串中“准备”一条语句;可以通过将表达式连接到其中来代替标识符来构造这样的字符串:

SELECT CONCAT(
  'SELECT * FROM `', REPLACE(databaseName, '`', '``'), '`.users'
) INTO @qry FROM companies.companyInfo WHERE ID = 1;

PREPARE stmt FROM @qry;
EXECUTE stmt;

但是,使用一个查询在应用程序中获取数据库名称可能同样容易SELECT,然后执行相同的连接以从那里发出第二个查询。

综上所述,也许您的数据结构需要进一步规范化?为什么不将所有数据库合并为一个,每个表中的一列指示每条记录与哪个公司相关?

于 2012-06-11T09:25:49.833 回答