MySQL子查询或连接不同的数据库,其中数据库名称在主查询的结果集中

时间:2016-10-06 14:47:35

标签: mysql sql join subquery innodb

例如,我需要列出所有客户并在这个简化的自解释SQL中计算他们的用户:

SELECT customer_name,
       (SELECT COUNT(*) FROM <main_db.customers.database_name>.users) AS user_count
FROM main_db.customers

假设这是 main_db 结构:

+--------------------------------+
| customer_name  | database_name |
|--------------------------------|
| Customer One   | customer_db1  |
| Customer Two   | customer_db2  |
| Customer Three | customer_db3  |
| etc...                         |
+--------------------------------+

这是 customer_dbX 结构:

+------------+
| users      |
|------------|
| User One   |
| User Two   |
| User Three |
| etc...     |
+------------+

我想收到这个结果集:

+-----------------------------+
| customer_name  | user_count |
|-----------------------------|
| Customer One   | 12         |
| Customer Two   | 59         |
| Customer Three | 34         |
| etc...                      |
+-----------------------------+

是否可以使用子查询,连接或ANY语法?

2 个答案:

答案 0 :(得分:1)

评论太长了。

不,你不能做你想要的单个查询。您可以使用动态SQL来使用information_schema.schemata表。

但是,也许还有其他解决方案。首先,我建议您不要为不同的客户使用单独的数据库,除非您绝对必须这样做。以下是您拥有的一些原因:

  • 您在合同中有义务使用单独的数据库(可能是因为律师不完全了解数据库安全性)。
  • 数据库具有不同的备份/恢复要求。
  • 不同的客户将拥有最容易作为不同数据库处理的客户特定自定义。

在大多数情况下,将多个客户的数据存储在单个数据库中是正确的方法。它当然简化了系统管理,升级到新版本,识别和修复错误,备份数据库,在发生故障时复制系统等等。

但是,如果您必须拥有单独的数据库,那么请考虑在master数据库中创建一个将所有表组合在一起的视图:

create view v_master_users as
    select 'x' as which, d.* from customer_db<X> d union all
    select 'x1' as which, d.* from customer_db<x> d union all
    . . .;

然后,使用此视图进行查询。

如果添加客户需要创建数据库,那么您将有足够的机会更新视图以处理新客户。

答案 1 :(得分:0)

如果我正确理解了您的问题,我会使用UNION

SELECT CUSTOMER_NAME FROM MAIN_DB.CUSTOMERS ORDER BY ID ASC
UNION
SELECT COUNT(*) FROM MAIN_DB.CUSTOMERS.USERS GROUP BY CUSTOMERS ORDER BY ID ASC