2009-05-14 3 views
1
mysql> select * from product; 
+------------+---------------+ 
| product_id | name   | 
+------------+---------------+ 
|   1 | Car   | 
|   2 | House   | 
|   3 | Cat   | 
|   4 | Blank Product | 
+------------+---------------+ 
4 rows in set (0.00 sec) 

mysql> select * from tag; 
+--------+-----------+ 
| tag_id | name  | 
+--------+-----------+ 
|  1 | Expensive | 
|  2 | Fast  | 
|  3 | Mean  | 
|  4 | Large  | 
|  5 | Small  | 
|  6 | Alive  | 
|  7 | Blank Tag | 
+--------+-----------+ 
7 rows in set (0.00 sec) 

mysql> select * from product_tag; 
+------------+--------+ 
| product_id | tag_id | 
+------------+--------+ 
|   1 |  1 | 
|   1 |  2 | 
|   1 |  3 | 
|   1 |  4 | 
|   2 |  1 | 
|   2 |  4 | 
|   3 |  2 | 
|   3 |  3 | 
|   3 |  5 | 
|   3 |  6 | 
+------------+--------+ 
10 rows in set (0.00 sec) 

Почему следующий запрос возвращает мой пустой тег, но не мой пустой продукт?MySQL несколько правых присоединяется

mysql> select * from product_tag right join product using (product_id) 
           right join tag using (tag_id); 
+--------+-----------+------------+-------+ 
| tag_id | name  | product_id | name | 
+--------+-----------+------------+-------+ 
|  1 | Expensive |   1 | Car | 
|  1 | Expensive |   2 | House | 
|  2 | Fast  |   1 | Car | 
|  2 | Fast  |   3 | Cat | 
|  3 | Mean  |   1 | Car | 
|  3 | Mean  |   3 | Cat | 
|  4 | Large  |   1 | Car | 
|  4 | Large  |   2 | House | 
|  5 | Small  |   3 | Cat | 
|  6 | Alive  |   3 | Cat | 
|  7 | Blank Tag |  NULL | NULL | 
+--------+-----------+------------+-------+ 
11 rows in set (0.00 sec) 

ответ

2

Нет идентификационного номера продукта 4 с тегом. Вам необходимо добавить строку в таблицу product_tag следующим образом:

+------------+--------+ 
| product_id | tag_id | 
+------------+--------+ 
|   4 |  7 | 
+------------+--------+ 
+0

Нет связанного с строкой тега 7 (пустой тег) с любым продуктом, и все же мое правое соединение возвращает его. – 2009-05-14 20:00:37

4

Вы используете правое соединение. Идентификаторы тегов являются базой, где MySQL начнет сопоставляться. Правильное соединение оценивается справа налево. Если вы разделите свой запрос на две части. Первый из них будет:

select * from product_tag right join tag using (tag_id); 
+--------+-----------+------------+ 
| tag_id | name  | product_id | 
+--------+-----------+------------+ 
|  1 | expensive |   1 | 
|  1 | expensive |   2 | 
|  2 | fast  |   1 | 
|  2 | fast  |   3 | 
|  3 | mean  |   1 | 
|  3 | mean  |   3 | 
|  4 | larg  |   1 | 
|  4 | larg  |   2 | 
|  5 | small  |   3 | 
|  6 | alive  |   3 | 
|  7 | blank tag |  NULL | 

+--------+-----------+------------+ 

Как вы видите, нет product_id, который совпадает с пустым тегом. Объясняется, почему объединение этого результата с таблицей продуктов даст вам результат, который вы видели.

Если вы используете левое соединение вместо этого вы получите этот результат:

select * from product_tag left join product using (product_id) left join tag using (tag_id); 

+--------+------------+-------+-----------+ 
| tag_id | product_id | name | name  | 
+--------+------------+-------+-----------+ 
|  1 |   1 | car | expensive | 
|  2 |   1 | car | fast  | 
|  3 |   1 | car | mean  | 
|  4 |   1 | car | larg  | 
|  1 |   2 | house | expensive | 
|  4 |   2 | house | larg  | 
|  2 |   3 | cat | fast  | 
|  3 |   3 | cat | mean  | 
|  5 |   3 | cat | small  | 
|  6 |   3 | cat | alive  | 
+--------+------------+-------+-----------+ 
+0

Отличный ответ. Очень подробный +1 –

0

Вы используете RIGHT JOIN так, что все строки в таблице справа т.е. «метка» будет возвращено, даже если нет соответствие в соединенных таблицах.