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

标签 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

假设这是ma​​in_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...                      |
+-----------------------------+

这可以通过子查询、连接或任何语法实现吗?

最佳答案

评论太长了。

不,您无法通过单个查询完成您想要的操作。您可以利用 information_schema.schemata 表来使用动态 SQL。

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

  • 根据契约(Contract),您有义务使用单独的数据库(可能是因为律师并不完全了解数据库安全性)。
  • 数据库有不同的备份/恢复要求。
  • 不同的客户将拥有特定于客户的自定义设置,这些自定义设置最容易作为不同的数据库进行处理。

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

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

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

然后,使用此 View 进行查询。

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

关于MySQL子查询或连接不同数据库,其中数据库名称在主查询的结果集中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39899127/

相关文章:

sql - 使用单个 JOIN Select 语句替代/替代 UNION

php - 从视频中选择 * WHERE url = substring($url, 0, 5)

mysql - 为 mysql 上的 cakephp 定义种子脚本并给出 1 的示例

c# - 如何加密 SQLite 数据库文件 ".s3db"?

sql - 如何让 Oracle 将 JSON 比较为 JSON,而不是字符串

php - codeigniter 事件记录 : Fields lost when performing a JOIN

python - 访问html标签中的特定表

mySQL GROUP BY 不同值相同

php - SQL 查询使用 WHERE 子句从一个表中选择另一个表

php - 减少 MySQL 查询数量并按正确顺序输出数据