2012-10-02 6 views
10

私は最初のデータベースこのようなテーブル付き(DBA)は、命名したユーザー名2つの異なるデータベースで2つのテーブルを左に結合する方法は?

+------------------+--------------+ 
| Username   | PhoneNumber | 
+------------------+--------------+ 
| jamesbond007  | 555-0074  | 
| batmanbegins  | 555-0392  | 
+------------------+--------------+ 

が、その後、他の側に、私はPrivateMessageという名前のこのようなテーブル、とDBBを持っています。

+------------------+---------------------------------+ 
| Username   | Message       | 
+------------------+---------------------------------+ 
| jamesbond007  | I need new bond-girl   | 
| batmanbegins  | thanks for the paycheck, Nolan | 
+------------------+---------------------------------+ 

今、出力は次のようになりますので、2つの異なるデータベースからこの2つのテーブルを結合する方法:

+------------------+--------------+---------------------------------+ 
| Username   | PhoneNumber | Message       | 
+------------------+--------------+---------------------------------+ 
| jamesbond007  | 555-0074  | I need new bond-girl   | 
| batmanbegins  | 555-0392  | thanks for the paycheck, Nolan | 
+------------------+--------------+---------------------------------+ 
+0

を試してみてください。 –

+1

dbA、dbBはデータベースではないテーブルです。 – fearis

答えて

10

あなたは単に異なるデータベースのテーブルに参加することができます。 FROM句にデータベース名を指定する必要があります。 、それは短く、その上にALIASを追加

SELECT a.*,   -- this will display all columns of dba.`UserName` 
     b.`Message` 
FROM dba.`UserName` a -- or LEFT JOIN to show all rows whether it exists or not 
     INNER JOIN dbB.`PrivateMessage` b  
     ON a.`username` = b.`username` 

が、いくつかの方法を作るために、メッセージはありません-でusername possiblitiesがあります。この場合、dba.Usernameのすべてのレコードを表示したい場合は、LEFT JOINを使用してください。

あなたのコメントから読んで、テーブルは異なるcollationがあります。この上の周りの仕事は、あなたが好きにlatin1_swedish_ciを変更することができます

SELECT a.*,   -- this will display all columns of dba.`UserName` 
     b.`Message` 
FROM dba.`UserName` COLLATE latin1_swedish_ci a 
     LEFT JOIN dbB.`PrivateMessage` COLLATE latin1_swedish_ci b  
     ON a.`username` = b.`username` 

、ご参加の文にCOLLATEを指定することです。あなたはALTERにテーブルを十分な権限を持っている場合は

COLLATION詳細については、

Character Sets and Collations in MySQL


のこの完全なリストを参照して、単純に手動で変換し、その照合順序を一致させるために、この構文を使用します、

ALTER TABLE tbl_name CONVERT TO CHARACTER SET latin2 COLLATE 'latin2_general_ci'; 
+2

あなたは正しいです。私はテーブルに異なる照合をしています。今すぐ修正... –

+0

素晴らしい!あなたの問題はすでに解決されていますか? –

+1

はい。あなたのおかげで...あなたのための "答え"と+1とマーク... –

0

これはかなり簡単です...

SELECT A.Username, A.PhoneNumber, B.Message 
FROM dbA.Username as A 
INNER JOIN dbB.PrivateMessage as B ON A.Username = B.Username 

...接続内の両方のデータベースにアクセスできると仮定します。

アクセスできない場合は、クエリを実行する前に他のデータベースにテーブルをコピーするなど、別の方法で作業する必要があります。

+0

上のデータベースのために動作します:#1267から –

+0

「=」の動作のための不正な照合順序(utf8_unicode_ci内、IMPLICIT)とのミックス(utf8_general_ci、IMPLICIT)を次に、あなたのテーブルの照合順序が異なるため、それらのテーブルには参加できません。あなたは最初にこのクエリを実行するためにそれらを出さなければなりません。一つの方法は 'ALTER TABLE dbA.Username CONVERT TO CHARACTER SET uft8 COLLATE utf8_general_ci;になります。 ALTER TABLE dbB.PrivateMessage CONVERT TO CHARACTER SET uft8 COLLATE utf8_general_ci; '。これはテーブルの文字セットを変更するので、あなたがやっていることを知っていて、それが他の重要なアプリケーションに影響しない場合にのみ、これを実行してください。 – Bjoern

3

データベースを指定することを除いて、あなたは、通常のテーブルのと同じ:外を見るために

SELECT dbA.Username, dbA.PhoneNumber, dbB.Message 
    FROM dbA.Username LEFT JOIN dbB.PrivateMessage 
    ON (dbA.UserName.Username = dbB.PrivateMessage.Username); 

もの:

  • LEFT JOINのはメッセージなしでそれら(の使用も、すべてのユーザーを返します。 INNER JOINメッセージを含む)
  • 複数のメッセージを持つユーザーは、複数回表示されます(集計を使用し、GROUP BYは検索のみ1つのメッセージにつき1つのメッセージ - 1つのメッセージを選択するための基準を提供する必要があります)
  • 両方のデータベースに対してクエリ権限が必要です(そうでなければ、データベースからテーブルへのテーブルのサブセット)
  • 照合順序が一致しない可能性があります。この場合、COLLATEを使用するか、またはあるデータベースのフィールドをCONVERT:CONVERT(db.table.field US Latin1)、の文字セットに変換して、2つのテーブルのいずれかの照合順序を変更する必要があります。インデックスを使用しないようにして、パフォーマンスを低下させます。 2つのテーブルのうちの1つを変更できますが、を確認すると、ALTERのedテーブルを使用しているクエリやアプリケーションが中断されていないことを確認できます(ピンチでデータベース全体を変換してUTF8に変換します)。
  • JOIN sのテキストフィールドには、両方のテーブルにINDEXがあってもあまり効率的ではありません。ユニークで数値ののユーザーIDを持つメッセージ表をメッセージ所有者に照会させる方が良いでしょう。私は、論理が異なる2つのデータベースがこの解決策には役立たないかもしれないと理解していますが、上記の "トリック"( "テーブルまたはサブセットのコピー")の1つを適用して、 DBからDBへのテーブルの作成その1つの定期的なクエリは高価ですが、それ以降のすべてのジョインは大きなメリットがあります。

テストラン

これは2つの異なるデータベースで同じ構造を持つ2つのテーブルを作成し、それらを結合しながらデータベースです。

Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 3 
Server version: 5.6.30 openSUSE package 

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. 

Oracle is a registered trademark of Oracle Corporation and/or its 
affiliates. Other names may be trademarks of their respective 
owners. 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

mysql> CREATE DATABASE first_database; 
Query OK, 1 row affected (0.01 sec) 

mysql> CREATE DATABASE second_database; 
Query OK, 1 row affected (0.00 sec) 

mysql> USE first_database; 
Database changed 
mysql> CREATE TABLE mytable (x integer, t varchar(32)); 
Query OK, 0 rows affected (0.00 sec) 

mysql> INSERT INTO mytable (x, t) VALUES (1, 'One in First Database'), (2, 'Two in First Database'); 
Query OK, 2 rows affected (0.00 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

mysql> USE second_database; 
Database changed 
mysql> CREATE TABLE mytable (x integer, t varchar(32)); 
Query OK, 0 rows affected (0.00 sec) 

mysql> INSERT INTO mytable (x, t) VALUES (1, 'One in Second Database'), (3, 'Three in Second Database'); 
Query OK, 2 rows affected (0.00 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

mysql> USE test; 
Database changed 
mysql> SELECT * FROM first_database.mytable LEFT JOIN second_database.mytable USING (x); 
+------+-----------------------+------------------------+ 
| x | t      | t      | 
+------+-----------------------+------------------------+ 
| 1 | One in First Database | One in Second Database | 
| 2 | Two in First Database | NULL     | 
+------+-----------------------+------------------------+ 
2 rows in set (0.00 sec) 

mysql> 
+1

#1267 - 操作 '='の照合(utf8_unicode_ci、IMPLICIT)と(utf8_general_ci、IMPLICIT)の不正な組み合わせ –

+0

@Robert Hansonと同じエラーが発生します。あなたは@ロバーツを理解しましたか? – jason3w

+0

これは同じデータベース内の2つのテーブルを結合します – fearis

0

あなたが別の照合順序を持っているので、以下の私の答えを参照してください以下のコード

SELECT * FROM dbA.Username JOIN dbB.PrivateMessage USING(Username); 
関連する問題