2017-02-09 67 views
0

我有一个应用程序有一个中央数据库,其中包含一般信息以及所有使用我的应用程序的公司的信息。加入两个数据库时,其中一个名称包含在另一个

因此,数据库中的一个是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' 

(d1.databasename)在第二SQL是试图获取从由api_key列在第一个数据库中找到该行的第二个数据库的名称。

+1

你或许可以使用动态SQL做到这一点,但你的如果您真的需要这样做,设计可能会有问题。 –

+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中提到的数据库。

(你是不是真的采用明文存储密码,是你吗?如果你是,你让你的设置容易受到犯罪分子。)

+0

密码已加密! :-) –

+0

这很好,但仍需要两个过程,一个是将数据库获取到'USE',然后是加入的查询。虽然它很整齐。 –

相关问题