背景:
下面两种方式都是在查询吸毒人员的基本信息,pa_account 表示该吸毒人员的评估小组,一般情况下,录入吸毒人员基础信息都会录入其关联的评估小组,但是部分也不录入。理论上,无论评估小组有没有录入,left join 都要返回左表addicts数据的,但是若没有录入评估小组,第一种查询方式就不会返回数据。
直接上代码
第一种查询方式:
$map['a.uid']=$uid;
$map['b.paid']=0;
$addicts = db('addicts')
->alias('a')
->join('pa_account b','b.aid = a.aid','left')
->where($map)
->field('a.*,b.account_name s_name')
->find();
第二种查询方式
$map['a.uid']=$uid;
$addicts = db('addicts')
->alias('a')
->join('pa_account b','b.aid = a.aid and b.paid=0','left')
->where($map)
->field('a.*,b.account_name s_name')
->find();
分析:
可以看到,left join 的表是带一个默认的条件的,就是 b.paid = 0;,如果把这个条件直接写到map里面去查询,当 pa_account 不存在对应数据时,整个查询就会返回空。所以当 left join 的表如果带默认条件时,正确的写法应该是第二种。