当left join返回null时,'where'条件失败

时间:2014-12-15 05:50:03

标签: php mysql

left join失败时,由于vlu.status=1查询而未返回任何内容。 即使左连接失败,我也想要结果。

如果我删除了vlu.status=1,那么它会返回正确的结果,但是当左连接没有失败时我必须使用vlu.status=1

select vb.first_name,vb.last_name,DATE_FORMAT(vb.created_date,'%m-%d-%Y') as Created_On,
     concat(la.first_name,' ',la.last_name) as Loan_Agent, vl.loan_number, 
     count(vs.id) as Num_Deliveries from vid_borrowers vb 

         inner join vid_loans vl on vl.borrower_id= vb.id 
         left join vid_delivery_schedules vs on vs.borrower_id = vb.id
         left join vid_loan_agents la on la.id=vl.loan_officer_id 
         left join vid_users vlu on vlu.id=la.user_id 

     where vb.bank_id=6
       AND STR_TO_DATE(vb.created_date, '%Y-%m-%d') between  '2014-12-01' and '2014-12-16'
     and  vlu.status=1
     group by vb.first_name, vb.last_name, la.first_name, la.last_name, vl.loan_number

3 个答案:

答案 0 :(得分:1)

将条件放在连接中并从WHERE子句中删除它;如果条件在涉及WHERE之前失败,那么这样做会创建一个NULL行。

 ...
 left join vid_users vlu on vlu.id=la.user_id and vlu.status = 1
 where vb.bank_id=6
   AND STR_TO_DATE(vb.created_date, '%Y-%m-%d') between  '2014-12-01' and '2014-12-16'
 group by vb.first_name, vb.last_name, la.first_name, la.last_name, vl.loan_number

你也可以让WHERE通过检查NULL值来处理它,但恕我直言,最好尽快执行过滤。

答案 1 :(得分:1)

这里的问题是,通过应用LEFT JOINWHERE过滤器,LEFT JOIN失败的条件会为vlu.status返回NULL,然后将其过滤掉在WHERE中(因为标准为vlu.status = 1)。您需要更改:

WHERE ...
AND (vlu.status = 1 OR vlu.status IS NULL) -- NULL for the Left Join

或者将vlu.status过滤器移动到LEFT JOIN条件

LEFT JOIN vid_users vlu on vlu.id=la.user_id AND vlu.status = 1

More on this here

答案 2 :(得分:0)

coalesce function获取表达式列表并返回第一个不为空的结果。您可以使用它来使用默认值替换空值:

coalesce(vlu.status = 1, true)