如何使用列值作为来自这两个不同数据库的两个表的 数据库名称 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/