我有一个应用程序,它有一个中央数据库,其中包含一般信息,以及使用我的应用程序的所有公司的信息。
因此,数据库一是main
并且有一个表users
,为了参数的缘故,这样的表如下:
id | name | api_key | databasename
1 | Company1 | 12345678 | user_data_1
因此,数据库2名为user_data_1
,看起来像这样:
id | name | password | more things...
1 | My Name | abc123 | ....
我知道如果我写这个,我可以加入这些数据库来获取公司和用户数据:
SELECT d2.name as username, d1.*
FROM main.users d1, user_data_1.users d2
WHERE d1.`api_key`='12345678' AND d2.password='abc123'
现在,我很确定答案是否定的,因为我无法找到任何暗示我能做到的事情,但有没有办法从第一行的第二行动态获取第二个数据库的名称并写下这个:
SELECT d2.name as username, d1.*
FROM main.users d1, **(d1.databasename)**.users d2
WHERE d1.`api_key`='12345678' AND d2.password='abc123'
第二个SQL中的(d1.databasename)是尝试从api_key
列的第一个数据库中找到的行中获取第二个数据库的名称。
答案 0 :(得分:0)
有没有办法从第一个
的行动态获取第二个数据库的名称
否,不在纯SQL中。纯SQL不允许在数据库,表或列的命名中进行符号替换。
您需要编写一个程序来生成SQL。它可能就像让程序生成SQL语句一样简单
USE user_data_1;
发出一堆普通查询之前。在你的例子中......
USE user_data_1;
SELECT d2.name as username, d1.*
FROM main.users d1, users d2
WHERE d1.`api_key`='12345678' AND d2.password='abc123';
请注意,对users
的引用不受数据库名称的限制。这意味着它来自最近USE
中提到的数据库。
(你真的不是用纯文本存储密码,不是吗?如果你是,那么你的设置容易受到网络犯罪分子的攻击。)