Im trying to do multiple LEFT JOIN's on the same column of a table.I need to LEFT JOIN "table2.words" with "table1.color" and "table2.words" with "table1.food". How do I do this? and can I do it by making the left joined "table2.words" a new column?
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
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 |
--------------------------------
table2:
---------------------------
| id | words |
---------------------------
| 1 | yellow |
| 2 | blue |
| 3 | cookies |
| 4 | milk |
---------------------------
What Im trying to output:
----------------------------------------
| 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 |
----------------------------------------
Note: I cant change the table structures.
SQL LEFT JOIN Keyword. The LEFT JOIN keyword returns all records from the left table (table1), and the matching records from the right table (table2). The result is 0 records from the right side, if there is no match. LEFT JOIN Syntax
We note that if the join columns in the two tables have different names, both columns appear in the resulting data frame, so we rename the user_id column in the users table before merging.
When determining the order of tables in a LEFT JOIN, the general rule is to start with the table from which you want to keep all the records in the final result. Also, keep in mind that a LEFT JOIN cascades to all joins in a query. If you use a LEFT JOIN, often the subsequent tables should also be left-joined.
Because non-matching rows in the right table are filled with the NULL values, you can apply the LEFT JOIN clause to miss-match rows between tables. For example, to find the country that does not have any locations in the locations table, you use the following query:
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;
Your Sample Data
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)
Results of My Query
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
In the event there are values for food or color that do not exist, here is the adjusted query:
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;
I will add rows to table1 and run this new query
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>
Given any invalid data, LEFT JOIN
in still needed.
try:
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
Here is the query:
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
Note: It looks from your data that a LEFT JOIN
is not needed. If there are no rows in table1 where either color or food are null, then you can leave off the LEFT
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With