在閱讀您的說明之後,我覺得您確實想要查詢駐留在兩個單獨的MySQL服務器實例中的表。至少,你的澄清文字:
SELECT foreign_db.login.username,姓名,從foreign_db.login姓氏,用戶在那裏
表明,要運行一個查詢同時登錄兩個用戶(可能或不可能駐留在同一個mysql服務器實例中)。
在你的問題中,你說過你想從兩個不同的數據庫中查詢數據,但重要的是要認識到一個MySQL實例可以有很多很多的數據庫。對於由同一個mysql實例管理的多個數據庫,您鏈接到的問題中提出的解決方案只是簡單的工作:只需在表名稱前加上數據庫名稱,用點號分隔數據庫和表名稱:<db-name>.<table-name>
。
但是,像我指出,這僅僅在進行:
- 你在一個查詢訪問的所有數據庫駐留在同一臺服務器上 - 也就是說,由相同的MySQL實例
- 用戶管理連接到數據庫的用戶有權訪問這兩個表。
Scenario1:同一臺主機上的數據庫:授予appopriate特權和限定表名稱
因此,如果表實際駐留在同一個MySQL實例,就沒有必要進行第二次登錄或連接 - 簡單授予您用於連接到數據庫的數據庫用戶相應的權限,以從您需要的所有表中進行選擇。你可以做到這一點與GRANT
語法,這裏記載:http://dev.mysql.com/doc/refman/5.1/en/grant.html
例如,GRANT SELECT ON sakila.film TO 'test'@'%'
將允許用戶[email protected]%
在sakila
數據庫中選擇從film
表中的數據。這樣做之後,表示用戶可以參考使用sakila.film
此表(所謂限定的表名),或者如果當前數據庫設置爲sakila
,簡稱爲film
Scenario2:通過不同的MySQL實例管理的數據庫:FEDERATED引擎
如果要訪問的表實際上由兩個不同的MySQL實例管理,則根據您的配置,有一個技巧可能會或可能無法工作。由於MySQL 5.0 mysql支持FEDERATED
存儲引擎。這使您可以創建一個實際上不是表格的表格,而是創建遠程服務器上的表格的窺視孔。這臺發動機在這裏記載:http://dev.mysql.com/doc/refman/5.1/en/federated-storage-engine.html
例如,如果你知道有這個表中misc
數據庫的遠程主機上:
CREATE TABLE t (
id int not null primary key
, name varchar(10) not null unique
)
您可以用做當地的「指針」到該遠程表這樣的:
CREATE TABLE t (
id int not null primary key
, name varchar(10) not null unique
)
ENGINE = FEDERATED
CONNECTION='mysql://<user>@<remote-server>:<remote-port>/misc/t';
不幸的是,FEDERATED
引擎並不總是可用的,所以你必須先檢查你甚至可以使用。但假設它是這樣的,那麼您可以簡單地在查詢中使用本地表t,就像任何其他表一樣,MySQL將與遠程服務器通信並在另一端的物理表上執行適當的操作。
注意:FEDERATED表有幾個優化問題。你應該知道這些是否適用於你,以及這些適用於什麼程度。例如,將WHERE
應用於聯合表可能會導致整個表內容通過電纜被拉到您的本地服務器,在那裏實際的過濾將被應用。另一個問題是創建表格:除了ENGINE子句(和CONNECTION)之外,您必須非常確定聯合表格的定義和它所指向的表格是否完全匹配。例如,如果您有不同的字符集,則數據可能在通過導線後完全顯示爲亂碼。
如果你想使用FEDERATED
表,請閱讀這篇文章http://oreilly.com/pub/a/databases/2006/08/10/mysql-federated-tables.html來決定它是否適合你的特定用例。
如果你認爲你需要它,我有一個實用程序來創建此聯合表格:http://forge.mysql.com/tools/tool.php?id=54
場景3:在不同的MySQL實例不能使用聯合,但表
最後,如果你在不同的MySQL實例上有表,但由於某種原因不能使用聯邦表引擎,你恐怕運氣不好。你只需要對兩個MySQL實例執行查詢,接收結果並在PHP中對其進行智能化處理。根據您的具體要求,這可能是一個完全可行的解決方案
我想你需要自己決定我的答案哪個部分最能吸引你的問題,並添加評論以防你需要更多幫助。 TIA羅蘭。
經過一些測試,無論出於何種原因,我的設置不允許我執行數字(2)。我總是需要使用mysql_select_db。有效的做法是使用mysql_select_db在dbs之間切換,但這不允許我執行跨數據庫查詢。我正在考慮像select * from main_db.login,customerInfo where ...等 – Avery 2010-01-05 02:39:41
(2)是正確的答案。我的PHP服務器通過名稱指定的第二個數據庫中的部分數據執行數百次這樣的查詢。所以問題不在於「我該怎麼做?」還有更多「爲什麼這不起作用?」 – grahamparks 2010-01-10 22:34:31
經過一番激烈的挖掘,我得到它的工作,你會認爲它應該:SELECT * from foreigndb.login WHERE ...不知道誰得到賞金...也許我可以只降級這個問題...然後在慈善箱中投了一些聲望點。 – Avery 2010-01-12 06:49:38