MySQL несколько правых объединений - PullRequest
1 голос
/ 14 мая 2009
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> 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)

Ответы [ 3 ]

4 голосов
/ 15 мая 2009

Вы используете правое соединение. В ваших тегах запроса идентификаторы являются базой, с которой 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     | 
+--------+------------+-------+-----------+
2 голосов
/ 14 мая 2009

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

+------------+--------+
| product_id | tag_id |
+------------+--------+
|          4 |      7 | 
+------------+--------+
0 голосов
/ 05 декабря 2012

Вы используете ПРАВИЛЬНОЕ СОЕДИНЕНИЕ, поэтому все строки в правой таблице, т. Е. "Тег", будут возвращены, даже если в соединенных таблицах совпадений нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...