当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
答案 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 JOIN
和WHERE
过滤器,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
答案 2 :(得分:0)
coalesce
function获取表达式列表并返回第一个不为空的结果。您可以使用它来使用默认值替换空值:
coalesce(vlu.status = 1, true)