2010-10-23 7 views
1

S'il vous plaît considérer le tableau ci-après 'mmm':MySQL gauche se joindre à une table pour se

select * from mmm; 

sortie:

+-------+-------+------+ 
| texto | value | n | 
+-------+-------+------+ 
| aaa | 10 | 1 | 
| aab | 10 | 1 | 
| aaa | 11 | 1 | 
| aab | 11 | 1 | 
| aaa | 10 | 2 | 
+-------+-------+------+ 

La commande:

select a.*, '--', b.* 
    from mmm a 
left join mmm b on (a.n=b.n) 
where a.value < b.value 
    and a.texto ='aaa' 
    and b.texto='aab'; 

retours:

+-------+-------+------+----+-------+-------+------+ 
| texto | value | n | -- | texto | value | n | 
+-------+-------+------+----+-------+-------+------+ 
| aaa | 10 | 1 | -- | aab | 11 | 1 | 
+-------+-------+------+----+-------+-------+------+ 

Très bien. Mais ce que je veux est quelque chose comme:

+-------+-------+------+----+-------+-------+------+ 
| texto | value | n | -- | texto | value | n | 
+-------+-------+------+----+-------+-------+------+ 
| aaa | 10 | 1 | -- | aab | 11 | 1 | 
+-------+-------+------+----+-------+-------+------+ 
| aaa | 10 | 2 | -- | NULL | NULL | NULL | 
+-------+-------+------+----+-------+-------+------+ 
+1

Pour d'autres chercheurs Google: la cause de ce problème consiste à comparer a.value à b.value lorsque b.value est nul. – Tyzoid

Répondre

6
select a.*, '--', b.* 
    from mmm a 
left join mmm b on (a.n=b.n) 
where (a.value < b.value or b.value is null) 
    and a.texto ='aaa' 
    and (b.texto='aab' or b.textto is null); 

ou:

select a.*, '--', b.* 
    from mmm a 
left join mmm b on (a.n=b.n and a.value < b.value and b.texto = 'aab') 
where a.texto ='aaa' ; 
+1

+1: Ce dernier était la version que j'allais poster. Mais il n'y a pas besoin de crochets autour des critères LEFT JOIN –

+0

Merci Martin. C'était une version plus petite d'une grosse requête sql (au moins pour moi). Le problème était que j'insérais des conditions à propos de la seconde table sur la clause _where_ au lieu de la clause _on_ de la _left join_. – Luis