mysql子查询或连接数据库名称位于主查询结果集中的不同数据库

niwlg2el  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(318)

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

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

假设这是主数据库结构:

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

这是客户的dbx结构:

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

我要接收此结果集:

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

子查询、连接或任何语法都可以这样做吗?

soat7uwm

soat7uwm1#

这太长了,不能发表评论。
不,您不能作为单个查询执行所需操作。您可以利用 information_schema.schemata table。
但是,也许还有其他解决办法。首先,我建议您不要为不同的客户使用不同的数据库,除非您必须这样做。以下是您必须这样做的几个原因:
根据合同,您有义务使用不同的数据库(可能是因为律师不完全了解数据库的安全性)。
数据库有不同的备份/恢复要求。
不同的客户将拥有特定于客户的定制,这些定制最容易作为不同的数据库处理。
在大多数情况下,将多个客户的数据存储在一个数据库中是正确的方法。它当然简化了管理系统、升级到新版本、识别和修复bug、备份数据库、在出现故障时复制系统等等。
但是,如果必须有单独的数据库,请考虑在主数据库中创建一个将所有表组合在一起的视图:

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
    . . .;

然后,使用此视图进行查询。
如果添加客户需要创建数据库,那么您将有足够的机会更新视图以处理新客户。

krugob8w

krugob8w2#

如果我正确理解你的问题,我会用 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

相关问题