2012-05-14 17 views
8

Im tratando de hacer varias combinaciones LEFT JOIN en la misma columna de una tabla. Necesito DEJAR DE UNIR "table2.words" con "table1.color" y "table2.words" con "table1.food". ¿Cómo hago esto? y ¿puedo hacerlo haciendo que la izquierda se una a "table2.words" en una nueva columna?IZQUIERDA UNIR COMO NUEVA columna?

Mi código SQL:

SELECT table1.id, table1.color, table2.words 
FROM table1 
LEFT JOIN table2 ON table1.color=table2.id 
LEFT JOIN table2 ON table1.food=table2.id 

tabla1:

-------------------------------- 
| id  | color | food  | 
-------------------------------- 
| 1  | 1  | 3  | 
| 2  | 1  | 4  | 
| 3  | 1  | 3  | 
| 4  | 1  | 4  | 
| 5  | 2  | 3  | 
| 6  | 2  | 4  | 
| 7  | 2  | 3  | 
| 8  | 2  | 4  | 
-------------------------------- 

tabla2:

--------------------------- 
| id  | words   | 
--------------------------- 
| 1  | yellow   | 
| 2  | blue   | 
| 3  | cookies  | 
| 4  | milk   | 
--------------------------- 

¿Qué Im tratando de salida:

---------------------------------------- 
| id  | colorname | foodname  | 
---------------------------------------- 
| 1  | yellow  | cookies  | 
| 2  | yellow  | milk   | 
| 3  | yellow  | cookies  | 
| 4  | yellow  | milk   | 
| 5  | blue   | cookies  | 
| 6  | blue   | milk   | 
| 7  | blue   | cookies  | 
| 8  | blue   | milk   | 
---------------------------------------- 

Nota: no puedo cambiar las estructuras de la tabla.

+0

Según los datos que presenta, parece que esto se puede hacer con uniones internas rectas, ¿las uniones de la izquierda son realmente necesarias? –

Respuesta

21
SELECT 
    table1.id, 
    table2_A.words colorname, 
    table2_B.words foodname 
FROM table1 
LEFT JOIN table2 table2_A ON table1.color=table2_A.id 
LEFT JOIN table2 table2_B ON table1.food=table2_B.id; 

datos de la muestra

mysql> drop database if exists supercoolville; 
Query OK, 2 rows affected (0.06 sec) 

mysql> create database supercoolville; 
Query OK, 1 row affected (0.00 sec) 

mysql> use supercoolville; 
Database changed 
mysql> create table table1 
    -> (
    ->  id int not null auto_increment, 
    ->  color int, 
    ->  food int, 
    ->  primary key (id) 
    ->); 
Query OK, 0 rows affected (0.06 sec) 

mysql> insert into table1 (color,food) values 
    -> (1,3),(1,4),(1,3),(1,4), 
    -> (2,3),(2,4),(2,3),(2,4); 
Query OK, 8 rows affected (0.06 sec) 
Records: 8 Duplicates: 0 Warnings: 0 

mysql> create table table2 
    -> (
    ->  id int not null auto_increment, 
    ->  words varchar(20), 
    ->  primary key (id) 
    ->); 
Query OK, 0 rows affected (0.05 sec) 

mysql> insert into table2 (words) values 
    -> ('yellow'),('blue'),('cookies'),('milk'); 
Query OK, 4 rows affected (0.07 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

mysql> select * from table1; 
+----+-------+------+ 
| id | color | food | 
+----+-------+------+ 
| 1 |  1 | 3 | 
| 2 |  1 | 4 | 
| 3 |  1 | 3 | 
| 4 |  1 | 4 | 
| 5 |  2 | 3 | 
| 6 |  2 | 4 | 
| 7 |  2 | 3 | 
| 8 |  2 | 4 | 
+----+-------+------+ 
8 rows in set (0.01 sec) 

mysql> select * from table2; 
+----+---------+ 
| id | words | 
+----+---------+ 
| 1 | yellow | 
| 2 | blue | 
| 3 | cookies | 
| 4 | milk | 
+----+---------+ 
4 rows in set (0.00 sec) 

resultados de mis consultas

mysql> SELECT 
    ->  table1.id, 
    ->  table2_A.words colorname, 
    ->  table2_B.words foodname 
    -> FROM table1 
    ->  LEFT JOIN table2 table2_A ON table1.color=table2_A.id 
    ->  LEFT JOIN table2 table2_B ON table1.food=table2_B.id 
    -> ; 
+----+-----------+----------+ 
| id | colorname | foodname | 
+----+-----------+----------+ 
| 1 | yellow | cookies | 
| 2 | yellow | milk  | 
| 3 | yellow | cookies | 
| 4 | yellow | milk  | 
| 5 | blue  | cookies | 
| 6 | blue  | milk  | 
| 7 | blue  | cookies | 
| 8 | blue  | milk  | 
+----+-----------+----------+ 
8 rows in set (0.00 sec) 

mysql> 

ACTUALIZACIÓN 2012-05-14 19:10 EDT

En el caso de que sean los valores para alimentos o colores que no existen, aquí está la consulta ajustada:

SELECT 
    table1.id, 
    IFNULL(table2_A.words,'Unknown Color') colorname, 
    IFNULL(table2_B.words,'Unknown Food') foodname 
FROM table1 
LEFT JOIN table2 table2_A ON table1.color=table2_A.id 
LEFT JOIN table2 table2_B ON table1.food=table2_B.id; 

voy a añadir filas a tabla1 y ejecutar esta nueva consulta

mysql> drop database if exists supercoolville; 
Query OK, 2 rows affected (0.13 sec) 

mysql> create database supercoolville; 
Query OK, 1 row affected (0.00 sec) 

mysql> use supercoolville; 
Database changed 
mysql> create table table1 
    -> (
    ->  id int not null auto_increment, 
    ->  color int, 
    ->  food int, 
    ->  primary key (id) 
    ->); 
Query OK, 0 rows affected (0.08 sec) 

mysql> insert into table1 (color,food) values 
    -> (1,3),(1,4),(1,3),(1,4), 
    -> (2,3),(2,4),(2,3),(2,4), 
    -> (5,3),(5,4),(2,6),(2,8); 
Query OK, 12 rows affected (0.07 sec) 
Records: 12 Duplicates: 0 Warnings: 0 

mysql> create table table2 
    -> (
    ->  id int not null auto_increment, 
    ->  words varchar(20), 
    ->  primary key (id) 
    ->); 
Query OK, 0 rows affected (0.08 sec) 

mysql> insert into table2 (words) values 
    -> ('yellow'),('blue'),('cookies'),('milk'); 
Query OK, 4 rows affected (0.06 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

mysql> select * from table1; 
+----+-------+------+ 
| id | color | food | 
+----+-------+------+ 
| 1 |  1 | 3 | 
| 2 |  1 | 4 | 
| 3 |  1 | 3 | 
| 4 |  1 | 4 | 
| 5 |  2 | 3 | 
| 6 |  2 | 4 | 
| 7 |  2 | 3 | 
| 8 |  2 | 4 | 
| 9 |  5 | 3 | 
| 10 |  5 | 4 | 
| 11 |  2 | 6 | 
| 12 |  2 | 8 | 
+----+-------+------+ 
12 rows in set (0.00 sec) 

mysql> select * from table2; 
+----+---------+ 
| id | words | 
+----+---------+ 
| 1 | yellow | 
| 2 | blue | 
| 3 | cookies | 
| 4 | milk | 
+----+---------+ 
4 rows in set (0.00 sec) 

mysql> SELECT 
    ->  table1.id, 
    ->  IFNULL(table2_A.words,'Unknown Color') colorname, 
    ->  IFNULL(table2_B.words,'Unknown Food') foodname 
    -> FROM table1 
    -> LEFT JOIN table2 table2_A ON table1.color=table2_A.id 
    -> LEFT JOIN table2 table2_B ON table1.food=table2_B.id; 
+----+---------------+--------------+ 
| id | colorname  | foodname  | 
+----+---------------+--------------+ 
| 1 | yellow  | cookies  | 
| 2 | yellow  | milk   | 
| 3 | yellow  | cookies  | 
| 4 | yellow  | milk   | 
| 5 | blue   | cookies  | 
| 6 | blue   | milk   | 
| 7 | blue   | cookies  | 
| 8 | blue   | milk   | 
| 9 | Unknown Color | cookies  | 
| 10 | Unknown Color | milk   | 
| 11 | blue   | Unknown Food | 
| 12 | blue   | Unknown Food | 
+----+---------------+--------------+ 
12 rows in set (0.00 sec) 

mysql> 

Teniendo en cuenta los datos no válidos, en LEFT JOIN aún necesitaba.

+1

Me inclino ante tu asombro. –

+0

MUCHAS GRACIAS !!!!!!!!!!!!!!!!!!!! – supercoolville

3

intento:

SELECT table1.id, colorcodes.words, foodcodes.words 
FROM table1 
LEFT JOIN table2 as colorcodes 
    ON colorcodes.id = table1.color 
LEFT JOIN table2 as foodcodes 
    ON foodcodes.id= table1.food 
3

Ésta es la consulta:

SELECT a.id as id, b.words as colorname, c.words as foodname 
FROM table1 a 
    LEFT JOIN table2 b ON b.id = a.color 
    LEFT JOIN table2 c ON c.id = a.food 

Nota: Se ve a partir de sus datos que un LEFT JOIN no es necesario. Si no hay filas en la tabla 1 donde el color o la comida son nulos, puede dejar el LEFT.

+0

Esto funcionó también! ¡¡¡Gracias!!! – supercoolville

Cuestiones relacionadas