2017-02-09 32 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',然後是加入的查詢。雖然它很整齊。 –

相關問題