2009-05-14 10 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) 

Pourquoi la requête suivante renvoie-t-elle mon balise vide mais pas mon produit vide?Plusieurs jointures à droite 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) 

Répondre

2

Il n'y a pas de ligne associant l'ID de produit 4 avec une étiquette. Vous devez ajouter une ligne à la table product_tag comme suit:

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

Il n'y a pas de ligne associant le tag 7 (balise vide) avec un produit et pourtant ma bonne jointure le renvoie. –

4

Vous utilisez la jointure à droite. Dans vos balises de requête, les identifiants sont la base où MySQL commencera à correspondre. La jointure droite est évaluée de droite à gauche. Si vous divisez votre requête en deux parties. Le premier sera:

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 | 

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

Comme vous le voyez, il n'y a pas d'id_produit correspondant à la balise vide. La raison pour laquelle joindre ce résultat à la table des produits vous donnera le résultat que vous avez vu.

Si vous utilisez jointure gauche à la place que vous obtiendrez ce résultat:

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

Bonne réponse. Très détaillé +1 –

0

Vous utilisez un RIGHT JOIN donc toutes les lignes dans la table droite-à-dire « tag » sera retourné, même s'il n'y a correspondre dans les tables jointes.