2009-05-14 19 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

製品ID 4とタグを関連付ける行はありません。次のようにproduct_tagテーブルに行を追加する必要があります。

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

タグ7(空白タグ)を任意の製品に関連付ける行はありませんが、私の右結合がそれを返します。 –

4

右結合を使用しています。クエリタグでは、idsはMySQLがマッチングを開始するベースです。右結合は右から左へ評価されます。クエリを2つの部分に分割した場合。最初の1は次のようになります。

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がない見ての通り。この結果を製品表に結合する理由を説明すると、あなたが見た結果が得られます。

あなたは左使用する場合は、この結果得られます代わりに参加する:あなたはRIGHTを使用している

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

は右表のすべての行ので、JOINすなわち「タグ」はありませんがあっても返却されます結合されたテーブル内で一致します。

関連する問題