2009-12-24 5 views
2
mysql> select a.id,a.parent from qa a left join qa b on a.parent=b.parent where b.id=7; 
+----+--------+ 
| id | parent | 
+----+--------+ 
| 7 |  1 | 
| 8 |  1 | 
| 9 |  1 | 
+----+--------+ 
3 rows in set (0.00 sec) 

mysql> select a.id,a.parent from qa a left join qa b on a.parent=b.parent and b.id=7; 
+----+--------+ 
| id | parent | 
+----+--------+ 
| 1 | NULL | 
| 2 | NULL | 
| 3 | NULL | 
| 4 | NULL | 
| 5 | NULL | 
| 6 | NULL | 
| 7 |  1 | 
| 8 |  1 | 
| 9 |  1 | 
+----+--------+ 

Je les lis exactement pareil!Pourquoi ces deux énoncés ont-ils des résultats différents?

+0

Qu'est-ce qu'il y a dans le tableau? 'sélectionner * de qa' –

Répondre

3

La première instruction crée la jointure, puis filtre le résultat à l'aide de WHERE b.id = 7.

Alors que les lignes de una.parent = b.parent et ce résultat a rejoindre b.id = 7.

La deuxième déclaration va créer la gauche se joindre à la b.id = 7, incluant ainsi toutes les lignes de qa un, puis seules les valeurs de qa bb.id = 7.

Donc, toutes les lignes de una.parent = b.parent, mais montrent des valeurs de b que si b.id = 7

0

vous première requête limite la main droite côté de votre résultat en éliminant automatiquement le NULLs qu'un LEFT JOIN peut/va retourner. Les instructionsd renverraient les mêmes résultats si vous utilisiez un INNER JOIN.

0

La première condition (where) est affectée à l'instruction select, la seconde applique la condition b.id à la jointure.

De la documentation:

S'il n'y a pas de ligne correspondante de la table de droite dans la partie ON ou USING LEFT JOIN, une ligne avec toutes les colonnes mises à NULL est utilisé pour la table de droite.

Questions connexes