2012-05-14 19 views
8

Ich versuche, mehrere LINKE JOINs in der gleichen Spalte einer Tabelle zu tun. Ich muss JOIN "table2.words" mit "table1.color" und "table2.words" mit "table1.food" verlassen. Wie mache ich das? und kann ich es machen, indem ich die linke "table2.words" -Links zu einer neuen Spalte mache?LINKE VERBINDUNG ALS neue Spalte?

My SQL-Code:

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 

tabelle1:

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

table2:

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

Was Im ausgeben versuchen:

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

Hinweis: Ich kann die Tabellenstrukturen ändern.

+0

Aus den Daten, die Sie präsentieren, sieht es so aus, als könnte dies mit geraden, inneren Joins gemacht werden - sind Links Joins wirklich notwendig? –

Antwort

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; 

Ihre Beispieldaten

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) 

Ergebnisse Meine Suche

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> 

UPDATE 2012-05-14 19.10 EDT

Für den Fall, dort Werte Für Lebensmittel oder Farben, die nicht existieren, hier ist die angepasste Abfrage:

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; 

werde ich Zeilen tabelle1 hinzufügen und diese neue Abfrage

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> 

Da ungültige Daten, LEFT JOIN in noch benötigt laufen.

+1

Ich verneige mich vor deiner Großartigkeit. –

+0

DANKE SEHR VIEL !!!!!!!!!!!!!!!!!!!! – supercoolville

3

Versuch:

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

Hier ist die Abfrage:

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 

Hinweis: Aus Ihren Daten sieht, dass ein LEFT JOIN ist nicht erforderlich. Wenn in Tabelle 1 keine Zeilen vorhanden sind, in denen entweder Farbe oder Lebensmittel null sind, können Sie die LEFT auslassen.

+0

Das hat auch funktioniert! Vielen Dank!!! – supercoolville

Verwandte Themen