it-swarm.com.de

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

Ok, hier ist mein Dilemma. Ich habe eine Datenbank mit ungefähr 5 Tabellen eingerichtet, die alle exakt die gleiche Datenstruktur haben. Die Daten werden auf diese Weise zu Lokalisierungszwecken und zur Aufteilung von insgesamt rund 4,5 Millionen Datensätzen getrennt.

Meist wird nur ein Tisch benötigt und alles ist in Ordnung. Manchmal werden jedoch Daten aus zwei oder mehr Tabellen benötigt und diese müssen nach einer benutzerdefinierten Spalte sortiert werden. Hier habe ich Probleme.

datenspalten:

id, band_name, song_name, album_name, genre

MySQL-Anweisung:

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

MySQL spuckt diesen Fehler aus:

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

Offensichtlich mache ich das falsch. Möchte jemand etwas Licht in diese Sache bringen?

78
Jayrox

Ich denke, Sie suchen nach der UNION Klausel, a la

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

Es hört sich so an, als wären Sie mit einem einzigen Tisch zufrieden. Die fünf haben das gleiche Schema und müssen manchmal so dargestellt werden, als ob sie von einer Tabelle stammen, um alles in einer Tabelle zusammenzufassen.

Fügen Sie eine neue Spalte hinzu, die zur Unterscheidung zwischen den fünf Sprachen verwendet werden kann (ich gehe davon aus, dass die Sprache in den Tabellen unterschiedlich ist, da Sie angegeben haben, dass es sich um eine Lokalisierungsspalte handelt). Mach dir keine Sorgen über 4,5 Millionen Datensätze. Jede echte Datenbank kann mit dieser Größe problemlos umgehen. Wenn Sie die richtigen Indizes hinzufügen, können Sie sie problemlos als einzelne Tabelle behandeln.

19
Ned Batchelder

Alle obigen Antworten sind gültig. Alternativ können Sie den Tabellennamen auch um den Datenbanknamen erweitern. Beispiel:

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

Die Spalte ist mehrdeutig, da sie in beiden Tabellen angezeigt wird. Sie müssten das Feld where (oder sort) vollständig angeben, z. B. us_music.genre oder de_music.genre. Normalerweise würden Sie jedoch zwei Tabellen angeben, wenn Sie sie dann zusammenfügen würden etwas Mode. Die Struktur, mit der Sie sich befassen, wird gelegentlich als partitionierte Tabelle bezeichnet. In der Regel wird die Datenmenge jedoch auch in verschiedene Dateien aufgeteilt, anstatt die Datenmenge willkürlich aufzuteilen. Wenn Sie für die Datenbankstruktur verantwortlich sind und es keinen guten Grund gibt, die Daten zu partitionieren, würde ich eine große Tabelle mit einem zusätzlichen Feld "Origin" erstellen, das einen Ländercode enthält, aber Sie tun dies wahrscheinlich aus legitimen Gründen der Leistung . Verwenden Sie entweder eine Union, um die Tabellen zu verbinden, an denen Sie interessiert sind http://dev.mysql.com/doc/refman/5.0/en/union.html oder verwenden Sie die Merge-Datenbank-Engine - http://dev.mysql.com/doc/refman/5.1/de/merge-storage-engine.html .

4
Philip Mather

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

  1. wählen Sie die ID
  2. dann wähle die Haupttabelle damit aus
3
mehdi mohamadi

Ihr ursprünglicher Versuch, beide Tabellen zu überspannen, erstellt einen impliziten JOIN. Dies wird von den meisten erfahrenen SQL-Programmierern verpönt, da es die zu kombinierenden Tabellen von der Bedingung wie trennt.

Das UNION ist eine gute Lösung für die Tabellen, wie sie sind, aber es sollte keinen Grund geben, warum sie nicht mit einer angemessenen Indizierung in die eine Tabelle eingefügt werden können. Beim Hinzufügen des richtigen Index zu einer großen Tabelle wurde die Abfragegeschwindigkeit um drei Größenordnungen erhöht.

3
staticsan