关于left join遇到where就不管用的问题

  今天做了个存储过程,需要的功能是查询所有人的得分,有人没分就给零分,显而易见这里用左外连接是没有问题的,

但是在连接完之后有个根据时间筛选功能,于是我加了where条件判断,这时候没有想到的事情发生了,左外连接的作用没有

了,变得和内连接查询一样,没有得分的人不会被查询出来,后来问了人自己想了想,左外连接查询出来的是一个结果集,也

可以说是一张临时表,加上where之后就在查询出来的基础上筛选了一次,自然没有条件外的记录。正确的处理应该是把on后面的

where换成and来在连接的时候就进行查询,下面举一个例子。

下面有两张表

1.stu学生表

2.score成绩表

比较一下下面两种查询的不同吧!

SELECT s.`name`,IFNULL(c.`score`,0) AS score FROM stu s LEFT JOIN score c ON s.`id` = c.`stu_id` WHERE score > 50

这种是先查询出结果集再筛选,自然没有小于50的记录

SELECT s.`name`,IFNULL(c.`score`,0) AS score FROM stu s LEFT JOIN score c ON s.`id` = c.`stu_id` AND score > 50

这种是先再筛选查询出结果集,就可以查询出所有记录

 

posted @ 2016-07-20 22:33  zmc_change  阅读(1461)  评论(0编辑  收藏  举报