2009-12-24 21 views
10

Tengo una tabla que usa 3 claves externas en otras tablas. Cuando realizo una combinación a la izquierda, obtengo columnas duplicadas. MySQL dice que la sintaxis USING reducirá las columnas duplicadas, pero no hay ejemplos para claves múltiples.MySQL: Eliminar columnas duplicadas en Left Join, 3 tablas

Teniendo en cuenta:

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) 

Mi instrucción de consulta:

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 
); 

Mi objetivo es conseguir una fila de todas las columnas de la unión sin columnas duplicadas. Estoy usando MySQL C++ Connector para enviar las sentencias SQL y recuperar conjuntos de resultados. Creo que el conector de C++ tiene problemas con los nombres de columna duplicados.

Entonces, ¿cuál es la sintaxis de las sentencias SQL que debo usar?

Reference to MySQL JOIN syntax

Respuesta

13

creo que el siguiente debería funcionar:

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

Esto funciona, excepto cuando la tabla no existe. Así que puse cheques para eso. Además, esto supone que las tablas tienen nombres de columna exclusivos, excepto los campos de clave externa. Afortunadamente, eso es lo que tengo. **¡Muchas gracias!** –

2

Usted está seleccionando * de la tabla resultante combinada. Limite eso * a las columnas que quiera conservar.

+1

Como se mira en los datos de envío de MySQL, tengo un montón de columnas. Esto puede ser molesto si tengo que enumerar todas las columnas excepto las duplicadas. ¿Hay un calificador SQL que me permita enumerar todas las columnas excepto las que especifico? –

+0

No es que yo sepa. – tgandrews

4

ya que parece que la mayoría de las tablas que se están uniendo en columnas tienen unos a excepción de la primera, ¿qué tal:

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 
     ); 

no te puedo decir cuántas veces deseé tener

SELECT (* - foo) FROM table 

especialmente en los casos en que foo es un gran campo como un BLOB y solo quiero ver todo lo demás sin romper el formato.

+2

Aunque es posible enumerar cada columna válida, creo que es mucho trabajo para mi programa y también se agrega a la longitud de la declaración SQL que se envía a la base de datos. Vea la respuesta de Danny a continuación. –

0

Pruebe la siguiente consulta:

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