2009-01-03 12 views
73

Ok, hier ist mein Dilemma Ich habe eine Datenbank eingerichtet mit etwa 5 Tabellen alle mit der gleichen Datenstruktur. Die Daten werden auf diese Weise für Lokalisierungszwecke getrennt und auf insgesamt ca. 4,5 Millionen Datensätze aufgeteilt.MySQL - Auswählen von Daten aus mehreren Tabellen alle mit der gleichen Struktur, aber verschiedenen Daten

Ein Großteil der Zeit wird nur eine Tabelle benötigt und alles ist gut. Manchmal werden jedoch Daten von 2 oder mehr der Tabellen benötigt und müssen nach einer benutzerdefinierten Spalte sortiert werden. Hier habe ich Probleme.

Datenspalten:

id, band_name, song_name, album_name, genre 

MySQL statment:

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

MySQL diesen Fehler ausspuckt:

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

Offensichtlich ich das falsch tue. Wer möchte das für mich beleuchten?

Antwort

167

Ich glaube, Sie suchen die UNION Klausel, a la

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

danke, funktioniert genau, wie ich brauche :) – Jayrox

+0

großartige Idee !. Eine Stimme. – Sagotharan

+0

@ mihai-limban - Entschuldigen Sie die Störung, aber gibt es eine Möglichkeit, aus der Ergebnismenge zu erkennen, "welches Ergebnis von welcher Tabelle kam". Denn wenn wir einen Datensatz aus dieser Ergebnismenge aktualisieren/löschen müssen, gibt es keine Möglichkeit, dies zu wissen. –

18

Es klingt wie Sie mit einer einzigen Tabelle happer sein würde. Die fünf, die das gleiche Schema haben und manchmal so präsentiert werden müssen, als kämen sie von einem Tisch, zeigen, dass alles in eine Tabelle eingefügt wird.

Fügen Sie eine neue Spalte hinzu, die verwendet werden kann, um zwischen den fünf Sprachen zu unterscheiden (ich nehme an, dass es sich um eine Sprache handelt, die in den Tabellen unterschiedlich ist, da Sie angegeben haben, dass sie für die Lokalisierung bestimmt ist). Mach dir keine Sorgen über 4,5 Millionen Datensätze. Jede reale Datenbank kann diese Größe problemlos bewältigen. Fügen Sie die richtigen Indizes hinzu, und Sie werden keine Probleme damit haben, sie als einzelne Tabelle zu behandeln.

+0

Ich hatte ursprünglich alle meine Daten in einer einzigen Tabelle, aber es begann fast 5-10 Sekunden nach etwa 3,5 Millionen Datensätze zu kriechen. Ich fand das Aufteilen funktionierte am besten für mich, weil es viel schneller war. Ich habe jetzt einen neuen Webhost, also könnte es besser sein, aber scheint zu viel Mühe, es zu kombinieren – Jayrox

+23

Klingt, als ob Sie Indizes zu den Tabellen hinzufügen müssen. –

+2

Nochmals, ich wünschte, ich könnte Kommentare verbessern ... – staticsan

4

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 - zB:

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

das gibt Ihnen eine sehr schlecht definierte Ergebnismenge: alle möglichen Paare von uns_ und de_punk. –

3

Die Säule ist mehrdeutig, weil es in beiden Tabellen erscheint Ihnen müsste das Feld where (oder sort) vollständig angeben, wie us_music.genre oder de_music.genre, aber normalerweise würden Sie zwei Tabellen angeben, wenn Sie sie dann auf irgendeine Weise zusammenfügen würden. Die Struktur, mit der Sie arbeiten, wird gelegentlich als partitionierte Tabelle bezeichnet, obwohl es in der Regel auch dazu verwendet wird, das Dataset in separate Dateien zu unterteilen, anstatt das Dataset willkürlich aufzuteilen. Wenn Sie für die Datenbankstruktur verantwortlich sind und es keinen Grund gibt, die Daten zu partitionieren, würde ich eine große Tabelle mit einem zusätzlichen "Ursprungs" -Feld erstellen, das einen Ländercode enthält, aber Sie tun das wahrscheinlich aus berechtigten Gründen . Verwenden Sie entweder eine Union, um die Tabellen zu verknüpfen, an denen Sie interessiert sind http://dev.mysql.com/doc/refman/5.0/en/union.html, oder indem Sie die Merge-Datenbank-Engine http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html verwenden.

3

Ihr ursprünglicher Versuch, beide Tabellen zu überspannen, erzeugt einen impliziten JOIN. Dies ist von den meisten erfahrenen SQL-Programmierern verpönt, weil es die Tabellen trennt, die mit der Bedingung wie kombiniert werden sollen.

Die UNION ist eine gute Lösung für die Tabellen, wie sie sind, aber es sollte keinen Grund geben, dass sie nicht in die eine Tabelle mit anständigen Indizierung platziert werden können. Ich habe gesehen, dass das Hinzufügen des richtigen Index zu einer großen Tabelle die Abfragegeschwindigkeit um drei Größenordnungen erhöht.

3

Die union-Anweisung verursacht eine Transaktionszeit in riesigen Datenmengen.Es ist gut, die Auswahl in zwei Schritten auszuführen:

  1. wählen Sie die ID
  2. dann die Haupttabelle auswählen damit
Verwandte Themen