Sau khi đọc làm rõ của bạn, tôi dưới ấn tượng rằng bạn thực sự muốn truy vấn các bảng nằm trong hai cá thể máy chủ MySQL riêng biệt. Ít nhất, văn bản của bạn làm rõ:
CHỌN foreign_db.login.username, firstname, lastname từ foreign_db.login, dùng nơi
cho thấy rằng bạn muốn chạy một truy vấn trong khi đang đăng nhập như hai người dùng (có thể hoặc không thể cư trú trên cùng một cá thể máy chủ mysql).
Trong câu hỏi của bạn, bạn nói bạn muốn truy vấn dữ liệu từ hai cơ sở dữ liệu khác nhau, nhưng điều quan trọng là nhận ra rằng một cá thể MySQL có thể có nhiều, nhiều cơ sở dữ liệu. Đối với nhiều cơ sở dữ liệu được quản lý bởi cùng một cá thể mysql, giải pháp được đề xuất trong câu hỏi mà bạn liên kết chỉ đơn giản là làm việc: chỉ cần tiền tố tên bảng với tên cơ sở dữ liệu, tách cơ sở dữ liệu và tên bảng bằng dấu chấm: <db-name>.<table-name>
.
Nhưng, như tôi đã chỉ ra, điều này chỉ hoạt động nếu:
- tất cả các cơ sở dữ liệu bạn truy cập trong một truy vấn nằm trên cùng một máy chủ - có nghĩa là, được quản lý bởi các trường hợp MySQL cùng
- người dùng được kết nối với cơ sở dữ liệu có các đặc quyền phù hợp để truy cập cả hai bảng.
Scenario1: cơ sở dữ liệu trên cùng một máy chủ: cấp đặc quyền appopriate và đủ điều kiện tên bảng
Vì vậy, nếu các bảng thực cư trú trên dụ mysql cùng, không có nhu cầu về một đăng nhập thứ hai hoặc kết nối - đơn giản cấp cho người dùng cơ sở dữ liệu mà bạn sử dụng để kết nối với cơ sở dữ liệu các đặc quyền thích hợp để chọn từ tất cả các bảng bạn cần. Bạn có thể làm điều đó với các GRANT
cú pháp, tài liệu ở đây: http://dev.mysql.com/doc/refman/5.1/en/grant.html
Ví dụ, GRANT SELECT ON sakila.film TO 'test'@'%'
sẽ cho phép người dùng [email protected]%
để chọn dữ liệu từ bảng film
trong cơ sở dữ liệu sakila
. Sau khi làm điều đó, cho biết người dùng có thể tham khảo bảng này sử dụng sakila.film
(cái gọi là tên bảng đủ điều kiện), hoặc nếu cơ sở dữ liệu hiện tại được thiết lập để sakila
, đơn giản là film
Scenario2: cơ sở dữ liệu của trường MySQL khác nhau quản lý: FEDERATED Động cơ
Nếu các bảng bạn muốn truy cập thực sự được quản lý bởi hai cá thể MySQL khác nhau, có một mẹo có thể có hoặc không hoạt động, tùy thuộc vào cấu hình của bạn. Vì MySQL 5.0 mysql hỗ trợ công cụ lưu trữ FEDERATED
. Điều này cho phép bạn tạo một bảng không thực sự là một bảng, mà là một lỗ hổng tới một bảng trên một máy chủ từ xa. Động cơ này được ghi chép lại ở đây: http://dev.mysql.com/doc/refman/5.1/en/federated-storage-engine.html
Ví dụ, nếu bạn biết có bảng này trong cơ sở dữ liệu misc
trên máy chủ từ xa:
CREATE TABLE t (
id int not null primary key
, name varchar(10) not null unique
)
bạn có thể làm cho một địa phương 'trỏ' với bảng điều khiển từ xa sử dụng này:
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';
Thật không may, động cơ FEDERATED
không phải lúc nào cũng có sẵn, vì vậy bạn phải kiểm tra trước nếu bạn thậm chí có thể sử dụng. Nhưng giả sử nó là, sau đó bạn có thể sử dụng bảng cục bộ trong các truy vấn của bạn, giống như bất kỳ bảng nào khác và MySQL sẽ liên lạc với máy chủ từ xa và thực hiện các thao tác thích hợp trên bảng vật lý ở phía bên kia.
Lưu ý: có một số vấn đề tối ưu hóa với bảng FEDERATED. Bạn nên tìm hiểu xem liệu mức độ này có áp dụng cho bạn hay không. Ví dụ, việc áp dụng một WHERE
vào một bảng được liên kết có thể trong nhiều trường hợp dẫn đến toàn bộ nội dung bảng được cuộn qua dây tới máy chủ cục bộ của bạn, nơi mà việc lọc thực tế sẽ được áp dụng.Một vấn đề khác là với việc tạo bảng: bạn phải chắc chắn rằng các định nghĩa của bảng được liên kết và bảng nó trỏ đến khớp chính xác, ngoại trừ mệnh đề ENGINE (và CONNECTION). Ví dụ: nếu bạn có một bộ ký tự khác, dữ liệu có thể hoàn toàn bị cắt xén sau khi di chuyển qua dây.
Nếu bạn muốn sử dụng FEDERATED
bảng, hãy đọc bài viết này http://oreilly.com/pub/a/databases/2006/08/10/mysql-federated-tables.html để quyết định xem quyền của nó có phù hợp với trường hợp sử dụng cụ thể của bạn hay không.
Nếu bạn nghĩ rằng bạn cần nó, tôi có một tiện ích để tạo bảng liên đây: http://forge.mysql.com/tools/tool.php?id=54
Scenario3: không thể sử dụng FEDERATED, nhưng bảng trên trường MySQL khác nhau
Cuối cùng, nếu bạn có các bảng trên các cá thể MySQL khác nhau, nhưng không thể vì một lý do nào đó sử dụng công cụ bảng được liên kết, bạn không may mắn. Bạn chỉ đơn giản là sẽ phải thực hiện các truy vấn cho cả hai cá thể MySQL, nhận các kết quả và làm một cái gì đó thông minh với nó trong PHP. tùy thuộc vào yêu cầu chính xác của bạn, đây có thể là giải pháp hoàn toàn khả thi
Tôi đoán bạn cần tự quyết định phần nào trong câu trả lời của tôi kháng cáo tốt nhất và thêm nhận xét trong trường hợp bạn cần thêm trợ giúp. TIA Roland.
Sau một số thử nghiệm, vì lý do nào đó, thiết lập của tôi không cho phép tôi thực hiện số (2). Tôi luôn luôn cần phải sử dụng mysql_select_db. Một cái gì đó mà làm việc là sử dụng mysql_select_db để chuyển đổi giữa các dbs, nhưng điều này không cho phép tôi làm các truy vấn db chéo. Tôi đang nghĩ về một cái gì đó như chọn * từ main_db.login, customerInfo nơi ... vv – Avery
(2) là câu trả lời đúng. Máy chủ PHP của tôi thực hiện hàng trăm truy vấn như vậy một phút với một phần dữ liệu từ cơ sở dữ liệu thứ hai được chỉ định theo tên. Vì vậy, câu hỏi là ít hơn "Làm thế nào để làm điều này?" và nhiều hơn nữa "Tại sao điều này không hoạt động?" – grahamparks
Sau khi một số đào sâu xung quanh, tôi đã nhận nó để làm việc như bạn sẽ nghĩ rằng nó nên: SELECT FROM * foreigndb.login WHERE ... Không chắc chắn ai nhận được tiền thưởng ... Có lẽ tôi chỉ có thể giảm hạng câu hỏi này ... và sau đó đúc một số điểm danh tiếng trong thùng từ thiện. – Avery