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
这个是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
执行结果是
id=222的essay本来被删除的,现在对应的评论也出来了
总结:
- 如果SQL用的是Left Join ,On后面的条件对Left的表没有作用,只对Right的表有过滤作用,Where语句可以对Left的表有过滤作用
- 如果SQL用的是Right Join ,On后面的条件对Right的表没有作用,只对Left的表有过滤作用,Where语句可以对Right的表有过滤作用
- 如果SQL用的是Inner Join (也可以缩写成Join),On的条件对两个表都起作用。
参考 http://hfcombo.blog.51cto.com/9089438/1613342
http://m.studyofnet.com/news/434.html
http://blog.csdn.net/melody_mr/article/details/48596445