mysql - 基于列值的不同数据库的 MariaDB JOIN 表

标签 mysql mariadb

如何使用列值作为来自这两个不同数据库的两个表的 数据库名称 JOIN

我已经使用静态定义的(第二个)数据库名称成功连接了两个数据库之间的两个表:

SELECT * 
FROM db1.table_a AS ta
INNER JOIN db2.table_b AS tb on (ta.db_table_name = b.user_id) 

但是 db2.table_b 在该查询中的位置,我需要以某种方式让 db2 成为第一个数据库中第一个表中的值; 表名 将被静态定义。所有与 kind-of 相关的线程都是完全无用的,而且非常复杂。


详细信息:有一个通用数据库,所有其他数据库代表同一个应用程序,但用于不同的帐户。为了让所有不同帐户上的所有用户能够相互交互(例如 database_2.accounts.user.43 (DB->Table->Column->ID (43)),公共(public)数据库 ( db1 above) 不仅要存储用户的id,还要存储必须加入的数据库的名称。

帮助可视化事物:

  • 数据库:通用
  • 数据库:db2

SELECT id, database_name 
FROM common.table_a AS ct 
INNER JOIN [database_name].table_b AS dn ON (ct.user_id = [database_name].users.id)

视觉上返回的数据应该是这样的:

+----------+------------+----------+
| database | account_id | username |
+----------+------------+----------+
| db1      | 1          | John     |
+----------+------------+----------+
| db2      | 1          | Sally    |
+----------+------------+----------+
| db3      | 43         | John     |
+----------+------------+----------+
| db4      | 1          | Sally    |
+----------+------------+----------+

那么 HTML 输出应该是这样的:

  • 来自 db1 的 John 的评论。
  • 来自 db2 的 Sally 的评论。
  • 来自 db3 的 John 的评论。
  • 来自 db4 的 Sally 的评论。

我可以担心在视觉上确保来自 db1 的 John 和来自 db3 的 John(以及来自 db2 的 Sally 和来自 db4 的 Sally)这四个人在现实生活中都是不同的人。根据包含要用于 JOIN 的数据库名称的列值的值来选择它们的动态方面才是最重要的。

最佳答案

您有数百个数据库吗?那将是一个“糟糕”的设计。要进一步讨论,请解释为什么有这么多。

如果你没有很多数据库,但你需要动态选择哪个数据库,又是糟糕的设计;让我们进一步讨论。

如果您必须执行其中之一,请将其隐藏在存储例程中(正如 P.Salmon 几乎建议的那样;他的代码需要一些改进)或应用程序库(PHP、Java 等)。

否则,无论您说什么是 table_a,您都可以将其替换为 db1.table_a。事实上,您可以看到 MySQl 这样做:EXPLAIN EXTENDED SELECT ...;显示警告; 示例:

mysql> EXPLAIN EXTENDED SELECT province FROM canada; SHOW WARNINGS;
+----+-------------+--------+-------+---------------+----------+---------+------+------+----------+-------------+
| id | select_type | table  | type  | possible_keys | key      | key_len | ref  | rows | filtered | Extra       |
+----+-------------+--------+-------+---------------+----------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | canada | index | NULL          | province | 105     | NULL | 5484 |   100.00 | Using index |
+----+-------------+--------+-------+---------------+----------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.01 sec)

+-------+------+---------------------------------------------------------------------------------------+
| Level | Code | Message                                                                               |
+-------+------+---------------------------------------------------------------------------------------+
| Note  | 1003 | /* select#1 */ select `world`.`canada`.`province` AS `province` from `world`.`canada` |
+-------+------+---------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

在这个例子中,表 canada 被替换为 world.canada 因为 world 是数据库。

关于mysql - 基于列值的不同数据库的 MariaDB JOIN 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48062280/

相关文章:

PHP 从下拉列表中检索表

mysql - 将陀螺仪应用程序从 mysql (latin1) 迁移到 mariadb (utf8) 时出现字符编码问题

mysql - MariaDB 服务器已关闭,但我仍然可以使用 mysql 客户端登录(?)

MySQL 按日期排序 GROUP BY DATE FORMAT 是按字母顺序排列的

mysql - 合并查询和行到列

mysql - 将 Mysql 转储文件从 INSERT 转换为 INSERT IGNORE

php - 如何编写零售调度程序

php - SQLSTATE[HY000] [2002] 权限被拒绝 Laravel PDO 驱动程序(通过 artisan migrate 工作的凭据)

mysql - MariaDB 安装后没有提示密码

mysql - 从只有一个金额列和借方贷方列的表中选择用于试算表显示的语句