2009-12-24 32 views
10

Ich habe eine Tabelle, die 3 Fremdschlüssel in andere Tabellen verwendet. Wenn ich einen linken Join führe, erhalte ich doppelte Spalten. MySQL sagt, dass die USING Syntax die doppelten Spalten reduziert, aber es gibt keine Beispiele für mehrere Schlüssel.MySQL: Entfernen von doppelten Spalten auf Left Join, 3 Tabellen

Gegeben:

mysql> describe recipes; 
+------------------+------------------+------+-----+---------+-------+ 
| Field   | Type    | Null | Key | Default | Extra | 
+------------------+------------------+------+-----+---------+-------+ 
| ID_Recipe  | int(11)   | NO | PRI | NULL |  | 
| Recipe_Title  | char(64)   | NO |  | NULL |  | 
| Difficulty  | int(10) unsigned | NO |  | NULL |  | 
| Elegance   | int(10) unsigned | NO |  | NULL |  | 
| Quality   | int(10) unsigned | NO |  | NULL |  | 
| Kitchen_Hours | int(10) unsigned | NO |  | NULL |  | 
| Kitchen_Minutes | int(10) unsigned | NO |  | NULL |  | 
| Total_Hours  | int(10) unsigned | NO |  | NULL |  | 
| Total_Minutes | int(10) unsigned | NO |  | NULL |  | 
| Serving_Quantity | int(10) unsigned | NO |  | NULL |  | 
| Description  | varchar(128)  | NO |  | NULL |  | 
| ID_Prep_Text  | int(11)   | YES |  | NULL |  | 
| ID_Picture  | int(11)   | YES |  | NULL |  | 
| Category   | int(10) unsigned | NO |  | NULL |  | 
| ID_Reference  | int(11)   | YES |  | NULL |  | 
+------------------+------------------+------+-----+---------+-------+ 
15 rows in set (0.06 sec) 

mysql> describe recipe_prep_texts; 
+------------------+---------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+------------------+---------------+------+-----+---------+-------+ 
| ID_Prep_Text  | int(11)  | NO | PRI | NULL |  | 
| Preparation_Text | varchar(2048) | NO |  | NULL |  | 
+------------------+---------------+------+-----+---------+-------+ 
2 rows in set (0.02 sec) 

mysql> describe recipe_prep_texts; 
+------------------+---------------+------+-----+---------+-------+ 
| Field   | Type   | Null | Key | Default | Extra | 
+------------------+---------------+------+-----+---------+-------+ 
| ID_Prep_Text  | int(11)  | NO | PRI | NULL |  | 
| Preparation_Text | varchar(2048) | NO |  | NULL |  | 
+------------------+---------------+------+-----+---------+-------+ 
2 rows in set (0.02 sec) 

mysql> describe mp_references; 
+--------------+---------+------+-----+---------+-------+ 
| Field  | Type | Null | Key | Default | Extra | 
+--------------+---------+------+-----+---------+-------+ 
| ID_Reference | int(11) | NO | PRI | NULL |  | 
| ID_Title  | int(11) | YES |  | NULL |  | 
| ID_Category | int(11) | YES |  | NULL |  | 
+--------------+---------+------+-----+---------+-------+ 
3 rows in set (0.00 sec) 

Meine Abfrage-Anweisung:

SELECT * 
FROM Recipes 
LEFT JOIN (Recipe_Prep_Texts, Recipe_Pictures, mp_References) 
ON (
Recipe_Prep_Texts.ID_Prep_Text = Recipes.ID_Prep_Text AND 
Recipe_Pictures.ID_Picture = Recipes.ID_Picture AND 
mp_References.ID_Reference = Recipes.ID_Reference 
); 

Mein Ziel ist es eine Reihe von allen Spalten der Join ohne doppelte Spalten zu erhalten. Ich verwende MySQL C++ Connector, um die SQL-Anweisungen zu senden und Ergebnismengen abzurufen. Ich glaube, dass der C++ Connector Probleme mit doppelten Spaltennamen hat.

Also was ist die SQL-Statementsyntax, die ich verwenden sollte?

Reference to MySQL JOIN syntax

Antwort

13

Ich glaube, die folgende Arbeiten:

SELECT * 
FROM Recipes 
LEFT JOIN Recipe_Prep_Texts USING (ID_Prep_Text) 
LEFT JOIN Recipe_Pictures USING (ID_Picture) 
LEFT JOIN mp_References USING (ID_Reference) 
+2

Dies funktioniert, außer wenn die Tabelle nicht existiert. Also checke ich dafür. Dies setzt auch voraus, dass die Tabellen eindeutige Spaltennamen außer den Fremdschlüsselfeldern haben. Zum Glück habe ich das. **Danke vielmals!** –

2

Sie die Auswahl * aus der kombinierten resultierenden Tabelle. Begrenzen Sie das * auf die Spalten, die Sie behalten möchten.

+1

Wie Sie in den Post-Daten aus MySQL suchen, ich habe eine Menge von Spalten haben. Dies kann ein Schmerz sein, wenn ich alle Spalten mit Ausnahme der Duplikate auflisten muss. Gibt es ein SQL-Qualifikationsmerkmal, mit dem ich alle Spalten mit Ausnahme der von mir angegebenen Spalten auflisten kann? –

+0

Nicht, dass ich weiß. – tgandrews

4

Da es sieht aus wie die meisten Tische Sie schließen sich einige Spalten mit Ausnahme der ersten haben, wie etwa:

SELECT Recipes.*, 
      Recipe_Prep_Texts.Preparation_Text, 
      Recipe_Pictures.Foo, -- describe is missing in OP 
      mp_References.ID_Title, 
      mp_References.ID_Category 

    FROM Recipes 
LEFT JOIN (Recipe_Prep_Texts, Recipe_Pictures, mp_References) 
     ON (
      Recipe_Prep_Texts.ID_Prep_Text = Recipes.ID_Prep_Text AND 
      Recipe_Pictures.ID_Picture = Recipes.ID_Picture AND 
      mp_References.ID_Reference = Recipes.ID_Reference 
     ); 

Ich kann Ihnen nicht sagen, wie oft ich wünschte, ich hätte

vor allem in Fällen, wo foo ist ein großes Feld wie ein BLOB und ich will nur alles andere sehen, ohne die Formatierung zu brechen.

+2

Obwohl das Aufzählen jeder gültigen Spalte möglich ist, denke ich, dass es für mein Programm eine Menge Arbeit ist und auch die Länge der SQL-Anweisung erhöht, die an die Datenbank gesendet wird. Siehe Dannys Antwort unten. –

0

die folgende Abfrage Versuchen:

SELECT name,ac,relation_name 
FROM table1 
LEFT JOIN table2 USING (ID_Prep_Text) 
LEFT JOIN table3 USING (ID_Picture);