2017-05-18 39 views
1
查詢
mysqli_query("SELECT login.validto, 
(SELECT databases.databasename FROM DB1.databases WHERE databases.ID = login.ID ORDER BY databases.lastused DESC LIMIT 1) AS dbname, 
(SELECT users.username FROM dbname.users WHERE users.ID = '2') AS username 
FROM DB1.login 
WHERE login.token = 'abc13def456';"); 

是否可以使用別名DBNAME數據庫子查詢,而不是使用兩個單獨的查詢從PHP?MySQL數據庫名稱作爲別名多個數據庫之間

即時通訊使用1個數據庫來處理所有的登錄,然後我們用X數據庫來存儲所有的客戶數據,爲每個客戶數據庫,以後應該可以爲客戶數據庫之間進行切換。

林curently收到錯誤:

Error Code: 1142 
SELECT command denied to user 'myMySQLuser'@'myMySQLhost' for table 'users' 

更改DBNAME到真正的數據庫名工作得很好,和DBNAME和實時數據庫是一樣的,但我想使1個查詢,而不是2從我的PHP腳本。

+0

可能重複的[變量數據庫名稱](http://stackoverflow.com/questions/700970/variable-database-name) – Alexander

+0

有點maby,但我想用1單選擇,而不是運行多個查詢* * SET **之前我可以使用變量/別名。 – user1271152

+0

我明白你的意思。我建議你使用的方法制得的語句(https://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html)。我認爲,你可以使用它沒有臨時變量的內聯。 – Alexander

回答

0

可以使用existing solution在MySQL服務器上創建一個procedure,該服務器將從您的PHP應用程序中調用。

CREATE PROCEDURE my_proc() 
BEGIN 
    DECLARE @dbname, @username VARCHAR(25); 
    # Set @dbname value 
    SELECT databases.databasename INTO @dbname FROM DB1.databases WHERE databases.ID = login.ID ORDER BY databases.lastused DESC LIMIT 1; 
    # Create query to set @username value from required database 
    SET @user_query = CONCAT('SELECT users.username INTO @username FROM ', @dbname, '.users WHERE users.ID =2;'); 
    PREPARE stmt FROM @user_query; 
    EXECUTE stmt; # set @username value 
    DEALLOCATE PREPARE stmt; 
    # Main query 
    SELECT validto, @dbname, @username 
    FROM FROM DB1.login WHERE login.token = 'abc13def456'; 
END 

你也可以用你需要的參數調用過程。然後,您將能夠使用簡單的PHP語句來獲取所需的數據。

+0

是的,但犯規要求我知道用什麼數據庫?,我不知道它是什麼,直到數據庫查詢的一部分獲取這些信息,用戶輸入可以改變。 – user1271152

+0

@ user1271152,使用單獨的查詢獲取所需的數據庫名稱,然後使用該名稱準備新的查詢。在我的例子中,我使用3個查詢,但可以減少。 – Alexander