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)
答案 0 :(得分:4)
您正在使用正确的加入。在您的查询标签中,ids是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 |
+--------+------------+-------+-----------+
答案 1 :(得分:2)
没有将产品ID 4与标签相关联的行。您需要在product_tag表中添加一行,如下所示:
+------------+--------+
| product_id | tag_id |
+------------+--------+
| 4 | 7 |
+------------+--------+
答案 2 :(得分:0)
您正在使用RIGHT JOIN,因此即使连接表中没有匹配项,也会返回右表中的所有行,即“tag”。