Ok, hier ist mein Dilemma. Ich habe eine Datenbank mit ungefähr 5 Tabellen eingerichtet, die alle genau dieselbe Datenstruktur haben. Die Daten werden auf diese Weise zu Lokalisierungszwecken und zur Aufteilung von insgesamt rund 4,5 Millionen Datensätzen getrennt.
Meistens wird nur ein Tisch benötigt und alles ist gut. Manchmal werden jedoch Daten aus 2 oder mehr Tabellen benötigt und nach einer benutzerdefinierten Spalte sortiert. 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?
sql
mysql
join
mysql-error-1052
Jayrox
quelle
quelle
SELECT
, z. B.:(SELECT 'us_music' AS from_table, * FROM us_music WHERE genre = 'punk') UNION ...
(SELECT 1) AS select1 UNION (SELECT 2) AS select2 WHERE select1.id=select2.id
viewCount
undmovieTitle
wo es eine Datenbank für jeden Monat gibt. Sie vereinen alle 12 Tabellen, was in Ordnung ist, aber dann erhalten Sie 12 einzelne Ergebnismengen in der Ausgabe. Was wäre, wenn Sie nur eine Ergebnismenge wollten, in der alle Ergebnisse gruppiertmovieTitle
und derviewCount
Wert für jedemovieTitle
Zeile summiert wurden ?Es hört sich so an, als wären Sie mit einem einzigen Tisch glücklicher. Die fünf haben das gleiche Schema und müssen manchmal so dargestellt werden, als ob sie von einem Tabellenpunkt stammen, um alles in einer Tabelle zusammenzufassen.
Fügen Sie eine neue Spalte hinzu, mit der zwischen den fünf Sprachen unterschieden werden kann (ich gehe davon aus, dass sich die Sprache in den Tabellen unterscheidet, da Sie angegeben haben, dass es sich um eine Lokalisierung 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.
quelle
Jede der oben genannten Antworten ist gültig, oder eine alternative Möglichkeit besteht darin, den Tabellennamen auch um den Datenbanknamen zu erweitern - z.
SELECT * from us_music, de_music where `us_music.genre` = 'punk' AND `de_music.genre` = 'punk'
quelle
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, obwohl dies normalerweise dazu dient, das Dataset auch in verschiedene Dateien zu unterteilen, anstatt das Dataset nur 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 "Ursprungs" -Feld erstellen, das einen Ländercode enthält, aber Sie tun dies wahrscheinlich aus legitimen Leistungsgründen . Verwenden Sie entweder eine Union, um die Tabellen zu verknüpfen , an denen Sie interessiert sind : http: //dev.mysql.oder mithilfe der Merge-Datenbank-Engine http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html .
quelle
Ihr ursprünglicher Versuch, beide Tabellen zu überspannen, erzeugt einen impliziten JOIN. Dies wird von den meisten erfahrenen SQL-Programmierern missbilligt, da es die zu kombinierenden Tabellen mit der Bedingung wie trennt.
Dies
UNION
ist eine gute Lösung für die Tabellen, aber es sollte keinen Grund geben, warum sie nicht mit einer anständigen Indizierung in eine Tabelle eingefügt 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.quelle
Die
union
Aussage verursacht eine Deal-Zeit in riesigen Datenmengen. Es ist gut, die Auswahl in 2 Schritten durchzuführen:quelle