2010-10-23 71 views
1

请考虑下面的表 '嗯':MySQL的左连接一个表与自身

select * from mmm; 

输出:

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

命令:

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'; 

回报:

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

没关系。不过,我想是这样的:

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

对于其他的谷歌搜索:这个问题的根本原因比较a.value中时b.value到b.value一片空白。 – Tyzoid 2013-08-27 15:18:26

回答

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); 

或:

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:后一个是我要发布的版本。但是没有必要围绕LEFT JOIN标准 – 2010-10-23 19:24:23

+0

括号。谢谢Martin。这是一个较大的版本(至少对我来说)sql查询。问题在于我在_where_子句中插入了关于第二个表的一些条件,而不是_left join_的_on_子句。 – Luis 2010-10-23 23:45:12