Php ';其中';当左联接返回null时,条件失败

Php ';其中';当左联接返回null时,条件失败,php,mysql,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 Loa

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

将条件放入联接中,并将其从WHERE子句中删除;如果条件在涉及WHERE之前失败,那么这样做将创建一个空行

 ...
 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也处理它,但最好尽快执行筛选。

这里的问题是,通过应用
左连接和
其中
筛选器,
左连接失败的情况下
vlu.status
返回空值,然后在
中过滤掉(因为标准是
vlu.status=1
)。您需要更改以下任一项:

WHERE ...
AND (vlu.status = 1 OR vlu.status IS NULL) -- NULL for the Left Join
或将vlu.status过滤器移至左侧连接条件

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

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

coalesce(vlu.status = 1, true)

我没有投你反对票:哦。。。你解决了我的问题。我正在检查右勾,但上面写着等8点minutes@ASP.NetDeveloper你知道你只能勾选一个答案,对吗?你们已经在两个答案之间切换了几分钟:)斯塔尔特尔克先生比你们更早给出答案。。。我后来看到了,所以我勾选了他的答案。。。你的答案也是right@ASP.NetDeveloper我的回答是更早;看看时间戳,05:53:19(他的)和05:52:53(我的)。。事实上,这也是他之前提到的:)