在开发中,我们经常碰到据根某个字段分组查询,那个分组有6个组,但只有5个组有数据,那个没数据的分组就查不出来。这个在多表联查中就会出现。下面看一个示例:
1.两个表,城市区域表,一个是用户需求表,表字段就不演示了,看懂思路就行。要查询区域对应的需求数量
我原来的查法,没有查出来,看代码
$demand = area::alias('a')
-> join('UserDemand ud', 'ud.area_id = a.id','left')
-> where('ud.up_status', 0)
-> where('a.pid','=',2)
-> field('a.name,a.id as area_id,count(ud.id) as demand_num')
-> group('a.id')
-> select();
上面这样查只查出来了需求表有对应区域的数据,没有的就查不出来,看下面如何解决。下面是改进后的查法
$demand = area::alias('a')
->join('UserDemand ud', 'ud.area_id = a.id AND ud.up_status = 0', 'left') // 将条件放在连接上,可以查询出没有数据的区
->where('a.pid', '=', 2)
->field('a.name, a.id as area_id, COUNT(ud.id) as demand_num')
->group('a.id')
->select();
改进后就查出来了。就是要把需求表的条件放到join条件里一起加入到area区域表
关键点说明
-
条件放在连接上:在
LEFT JOIN
中,将ud.up_status = 0
的条件放在连接条件中,而不是WHERE
子句中。这样可以确保即使UserDemand
中没有匹配的记录,area
表中的所有区域仍然会被包括在内。 -
COUNT 函数:
COUNT(ud.id)
会计算UserDemand
中匹配的记录数。如果没有匹配的记录,返回的demand_num
会是 0。