essay文章表跟essay_comment评论表的关联是 essay.id=essay_comment.essay_id
SELECT e.id, e.app_id, e.deleted ,ec . *
FROM `essay` e
LEFT JOIN `essay_comment` ec ON e.id = ec.essay_id
and e.deleted=0
WHERE app_id = 11016
ORDER BY `e`.`deleted` ASC
LIMIT 0 , 30
![](http://upload-images.jianshu.io/upload_images/1446087-3cad2c0e7472a923.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这个是essay 左连接left join essay_comment,这就意味着左边的表只要跟右边的表联立的条件(e.id=ec.essay_id)成立,就无论如何左边的表记录都会出现,哪怕其他条件 (e.deleted =0 被删除的文章) 不成立,都会出现,就是说,这个e.deleted=0在on里面限制不了essay。参考上图的deleted字段,证明on里面的e.deleted=0没有生效,deleted=1的essay照样出现了。 这里要注意的是,on里面的条件是是必须都匹配才能使右边的表记录出来,否则就算deleted=1的essay出来了,但是它不同时符合e.deleted=0 and e.id=ec.essay_id,这就会使右边的表记录字段时都null。
所以当上面sql 去掉on里面的e.deleted=0
执行结果是
![](http://upload-images.jianshu.io/upload_images/1446087-99fc1d5f28624543.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
id=222的essay本来被删除的,现在对应的评论也出来了
总结:
1、如果SQL用的是Left Join ,On后面的条件对Left的表没有作用,只对Right的表有过滤作用,Where语句可以对Left的表有过滤作用
2、如果SQL用的是Right Join ,On后面的条件对Right的表没有作用,只对Left的表有过滤作用,Where语句可以对Right的表有过滤作用
参考 http://hfcombo.blog.51cto.com/9089438/1613342
http://m.studyofnet.com/news/434.html
http://blog.csdn.net/melody_mr/article/details/48596445