2012-10-02 5 views
10

Ich habe erste Datenbank (dbA) mit Tabelle wie folgt benannt Benutzername:How To Left Verbinden Sie 2 Tabellen auf 2 verschiedenen Datenbanken?

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

dann, auf der anderen Seite, ich habe DbB mit Tabelle wie folgt benannt Private:

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

jetzt, wie diese zwei aus zwei verschiedenen Datenbanken Tabellen zu kombinieren, so dass die Ausgabe wie folgt aussehen:

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

, da Sie andere Sortierung haben, siehe unten meine Antwort. –

+1

dbA, dbB ist eine Tabelle nicht Datenbank. – fearis

Antwort

10

Sie können einfach die Tabelle der anderen Datenbank verbinden. Sie müssen den Datenbanknamen in Ihrer FROM-Klausel angeben. Um es kürzer, ein ALIAS auf sich hinzufügen,

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` 

aber einige, wie, es gibt Möglichkeiten, wo in einem username nicht Nachrichten. Verwenden Sie in diesem Fall LEFT JOIN, wenn Sie immer noch alle Datensätze von dba.Username anzeigen möchten.

Lesen von Ihren Kommentaren, die Tabellen haben unterschiedliche collation. Die Arbeit um auf diesem ist COLLATE auf Ihrem verbundenen Aussagen zu spezifizieren,

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` 

Sie können latin1_swedish_ci ändern, was auch immer Sie wollen.

Für weitere Informationen über COLLATION finden diese vollständige Liste der

Character Sets and Collations in MySQL


Wenn Sie genug Privileg ALTER die Tabellen haben, einfach diese Syntax verwenden, um manuell zu konvertieren und ihre Sortierungen entsprechen ,

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

hast du recht. Ich habe unterschiedliche Sortierung auf meinen Tischen. Jetzt repariert ... –

+0

großartig! Dein Problem wurde bereits gelöst? –

+1

ja. dank dir ... markiert als 'antwort' und +1 für dich ... –

0

Die SQL dafür ist eher einfach ...

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

... vorausgesetzt, Sie können auf beide Datenbanken innerhalb Ihrer Verbindung zugreifen.

Wenn Sie nicht auf sie zugreifen können, müssen Sie an einem anderen Ansatz arbeiten (z. B. Kopieren einer Tabelle in die andere Datenbank vor dem Abfragen oder Ähnliches).

+0

Ich habe diese Fehlermeldung aus Ihrem Code: # 1267 - Illegale Mischung von Kollationen (utf8_unicode_ci, IMPLICIT) und (utf8_general_ci, IMPLICIT) für Operation '=' –

+0

Dann Ihre Tabellen haben unterschiedliche Sortierungen, so dass Sie ihnen nicht beitreten können. Sie müssen sie zuerst ausgleichen, um diese Abfrage auszuführen, eine Möglichkeit wäre, ALTER TABLE dbA.Username CONVERT TO CHARACTER SET uft8 COLLATE utf8_general_ci; ALTER TABLE dbB.PrivateMessage KONVERT AUF CHARAKTERSET uft8 COLLATE utf8_general_ci; '. Beachten Sie, dass dies den Zeichensatz der Tabellen ändert, also tun Sie dies nur, wenn Sie a) wissen, was Sie tun, und b) wenn es sich nicht auf andere kritische Anwendungen auswirkt. – Bjoern

3

Gleiche wie bei einer normalen Tabelle, mit Ausnahme der Datenbank angibt:

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

Dinge zu achten:

  • LEFT JOIN alle Benutzer zurückkehren, auch diejenigen, die keine Nachrichten (Verwendung zum Abrufen nur von Benutzern mit Nachrichten)
  • Benutzer mit mehreren Nachrichten werden mehrmals angezeigt (Aggregationen und GROUP BY nur Abruf verwenden e eine Nachricht pro Benutzer - Sie müssen ein Kriterium angeben, um die eine Nachricht auszuwählen.
  • Sie benötigen Abfrageberechtigungen für beide Datenbanken (andernfalls muss ein Benutzer mit Berechtigungen auf beiden Datenbanken kopieren, z. periodisch in crontab, eine Tabelle oder eine Teilmenge einer Tabelle von einer Datenbank zum anderen)
  • Sortierungen stimmen möglicherweise nicht überein. Wenn dies der Fall ist, müssen Sie die Sortierung in einer der beiden Tabellen entweder mit COLLATE ändern oder das Feld eines DB in den Zeichensatz des anderen mit CONVERT konvertieren: CONVERT (db.table.field USING Latin1), verhindern Sie die Verwendung von Indizes, wodurch die Leistung abnimmt. Sie können eine der beiden Tabellen ändern, aber verify, dass Sie nicht stören, was auch immer Abfrage oder Anwendung verwendet die ALTER 'Ed-Tabelle (im Notfall, konvertieren Sie die gesamte Datenbank zu gut gelaunt UTF8).
  • JOIN s Textfelder sind nicht sehr effizient, auch wenn Sie INDEX in beiden Tabellen haben; Es wäre besser, wenn die Nachrichtentabelle eine eindeutige numerische Benutzer-ID enthält, um auf den Nachrichtenbesitzer zu verweisen. Ich verstehe, dass zwei verschiedene Datenbanken mit unterschiedlichen Logiken für diese Lösung möglicherweise nicht förderlich sind, aber Sie könnten einen der oben genannten "Tricks" anwenden ("eine Tabelle oder eine Teilmenge davon kopieren") und regelmäßig eine konvertierte ID exportieren. Ed-Tabelle von einem DB zum anderen. Diese eine periodische Abfrage wäre teuer, aber alle nachfolgenden JOINs würden sehr profitieren.

Testlauf

Dies schafft zwei Tabellen mit derselben Struktur in zwei verschiedenen Datenbanken und schließt sich ihnen an, während in einem dritten Datenbank.

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

Ich habe diese Fehlermeldung: # 1267 - Illegale Mischung von Kollatierungen (utf8_unicode_ci, IMPLICIT) und (utf8_general_ci, IMPLICIT) für Operation '=' –

+0

Ich bekomme den gleichen Fehler wie @Robert Hanson. Hast du es @Robert herausgefunden? – jason3w

+0

Dies verbindet zwei Tabellen in der gleichen Datenbank – fearis

0

Versuchen Sie den Code unten

SELECT * FROM dbA.Username JOIN dbB.PrivateMessage USING(Username); 
Verwandte Themen