例:有动物表tb_biology_animal和动物分类表tb_biology_animal_type
,动物表有个字段fk_animal_type_id 是和动物分类表的animal_type_id关联着的,当然此处没有设置外键,在动物表添加数据的时候,没有填写动物分类的fk_animal_type_id ,也没有做验证,而在查询显示的时候需要把没有分类的动物数据显示出来,而此时左连接查询如下:
select
if(ISNULL(a.fk_animal_type_id),'NULL',b.type_name) typeName,
sum(num) as count,
unit
from
tb_biology_animal_type b left join tb_biology_animal a
on
if(ISNULL(a.fk_animal_type_id),1,a.fk_animal_type_id) = b.animal_type_id
where b.deleted=0 and a.deleted = 0
GROUP BY b.type_name order by count desc
返回结果:
而实际数据typeName是有空值的,所以正确的应该是这样的:
select IF(ISNULL(t.type_name),'NULL',t.type_name) typeName,a.count,a.unit from tb_biology_animal_type as t
RIGHT JOIN
(SELECT fk_animal_type_id,sum(num) count,unit
from tb_biology_animal where deleted = 0
GROUP BY fk_animal_type_id ) as a
on a.fk_animal_type_id = t.animal_type_id order by a.count desc
返回结果如下:
总结:为了避免这种查询情况出现,后面的动物添加或修改时做了分类不能为空的验证,就可以用简单一些的左连接查询的SQL了,当然已经写好的这个SQL不需要修改,只是在其他模块注意一下就可以了