MySQL - Auswählen von Daten aus mehreren Tabellen alle mit derselben Struktur, aber unterschiedlichen Daten

StackOverflow https://stackoverflow.com/questions/409705

Frage

Ok, hier ist mein Dilemma mir eine Datenbank mit etwa 5 Tabellen alle mit exakt dem gleichen Datenstruktur aufgebaut. Die Daten werden auf diese Weise für die Lokalisierung Zwecke getrennt und insgesamt etwa 4,5 Millionen Datensätze aufzuteilen.

Eine Mehrheit der Zeit nur eine Tabelle benötigt wird, und alles ist gut. Jedoch werden manchmal Daten von zwei oder mehr der Tabellen benötigt und es muss von einem Benutzer definierte Spalte sortiert werden. Dies ist, wo ich Probleme habe.

Datenspalten:

id, band_name, song_name, album_name, genre

MySQL statment:

SELECT * from us_music, de_music where `genre` = 'punk'

MySQL spuckt diesen Fehler:

#1052 - Column 'genre' in where clause is ambiguous

Natürlich, ich tue dies falsch. Jemand dafür interessieren, etwas Licht auf das für mich zu vergießen?

War es hilfreich?

Lösung

Ich glaube, du bist für die UNION Klausel suchen , a la

(SELECT * from us_music where `genre` = 'punk')
UNION
(SELECT * from de_music where `genre` = 'punk')

Andere Tipps

Es klingt wie Sie happer mit einer einzigen Tabelle sein würden. Die fünf das gleiche Schema hat, und benötigt manchmal dargestellt werden, als ob sie von einem Tisch Punkt kamen sie alle in einer Tabelle zu setzen.

eine neue Spalte hinzufügen, die verwendet werden können, unter den fünf Sprachen zu unterscheiden (ich nehme an, es ist die Sprache, die zwischen den Tischen unterschiedlich ist, da Sie sagten, dass es für die Lokalisierung ist). Sorgen Sie sich nicht über 4,5 Millionen Datensätze mit. Jede wirkliche Datenbank kann, dass Größe kein Problem behandeln. Fügen Sie die richtigen Indizes, und Sie werden keine Probleme haben, mit ihnen als eine einzige Tabelle zu tun.

Jede der oben genannten Antworten sind gültig, oder eine alternative Art und Weise ist der Name der Tabelle zu erweitern und den Datenbanknamen enthalten - zum Beispiel:

SELECT * from us_music, de_music where `us_music.genre` = 'punk' AND `de_music.genre` = 'punk'

Die Säule ist mehrdeutig, weil es in beiden Tabellen angezeigt würden Sie die, wo (oder Art) Feld voll wie us_music.genre oder de_music.genre aber Sie würden in der Regel angeben zwei Tabellen angeben müssen, wenn Sie dann beitreten wollen sie zusammen in irgendeiner Art und Weise. Die Struktur Ihres mit Umgang wird gelegentlich als eine partitionierten Tabelle, obwohl es in der Regel erledigt die Datenmenge in einzelne Dateien zu trennen und statt zu spalten nur den Datensatz willkürlich. Wenn Sie verantwortlich für die Datenbankstruktur sind, und es gibt keinen guten Grund, um die Daten zu partitionieren, dann würde ich einen großen Tisch mit einem zusätzlichen „Ursprung“ Feld bauen, die einen Ländercode enthält, aber sie sind wahrscheinlich es für legitim Performance Grund tun . Entweder eine Vereinigung verwenden, um die Tabellen zu verknüpfen Sie interessiert sind in http: / /dev.mysql.com/doc/refman/5.0/en/union.html oder durch den Merge-Datenbank-Engine http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html .

Ihre ursprüngliche Versuch, beide Tabellen zu überspannen schafft eine implizite JOIN. Dies ist verpönt von den meisten erfahrenen SQL-Programmierer, weil es die Tabellen trennt mit dem Zustand, wie. Kombiniert werden

Die UNION ist eine gute Lösung für die Tabellen, wie sie sind, aber es sollte kein Grund sein, sie in den einem Tisch mit anständiger Indizierung nicht gesetzt werden können. Ich habe den richtigen Index zu einer großen Tisch Erhöhung Abfragegeschwindigkeit um drei Größenordnung gesehen addieren.

Die union Anweisung einen Deal Zeit in großen Daten verursachen. Es ist gut, die Auswahl in zwei Schritten auszuführen:

  1. Wählen Sie die ID
  2. und wählen Sie die Haupttabelle mit ihm
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top