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

Warum gibt die folgende Abfrage mein leeres Tag zurück, aber nicht mein leeres Produkt?MySQL mehrere Recht Joins

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) 

Antwort

2

Es gibt keine Reihe Produkt-ID 4 mit einem Tag zugeordnet wird. Sie müssen der product_tag-Tabelle eine Zeile wie die folgende hinzufügen:

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

Es gibt keine Zeile, die Tag 7 (leeres Tag) mit einem Produkt assoziiert, und dennoch gibt meine rechte Verknüpfung es zurück. –

4

Sie verwenden richtige Verknüpfung. In Ihren Abfrage-Tags sind ids die Basis, auf der MySQL mit dem Abgleich beginnt. Der rechte Join wird von rechts nach links ausgewertet. Wenn Sie Ihre Anfrage in zwei Teile aufteilen. Der erste wird sein:

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 | 

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

Wie Sie sehen, gibt es nicht Produkt-ID, die mit dem leeren Tag übereinstimmt. Das erklärt, warum, wenn Sie dieses Ergebnis mit der Produkttabelle verbinden, Ihnen das Ergebnis geben wird, das Sie gesehen haben.

Wenn Sie links verwenden verbinden Sie stattdessen dieses Ergebnis bekommen:

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

Große Antwort. Sehr detailliert +1 –

0

Sie verwenden eine RIGHT JOIN so werden alle Zeilen in der rechten Tabelle heißt „Tag“ auch zurückgegeben werden, wenn es keine in den verbundenen Tabellen übereinstimmen.