hello,大家好,我是灰小猿!最近在做一个三表关联查询的场景处理时,遇到了一个比较有用的MySQL函数,在这里记录一下,大概场景如下:
需求场景
场景:有一张object_rel表,表中有一个object_id,这个object_id可能是object_a表的主键ID,也可能是object_b表的主键ID,object_a表和object_b表中有name字段,现在要查询object_rel表的数据,并且要根据object_rel表对应的name排序,请写一条sql实现这个查询
object_rel表结构及数据如下:


object_a表结构及数据如下:


object_b表结构及数据如下:


需求分析
针对上面的需求,如果要查询 object_rel 表的数据,并根据 object_rel 表中 object_id 对应的 object_a表或object_b表的 name 字段进行排序,可以使用 LEFT JOIN 连接这两个表。但是由于object_id字段可能存在object_a表也可能存在于object_b表,所以如果直接连表查询,查询出来的name列的数据可能为空,那么有没有一个函数,可以实现如果能在object_a表查询出name,就使用object_a表的name,否则就使用object_b表的name呢?
这个时候就需要使用到COALESCE函数了,
COALESCE函数
在COALESCE函数中,你可以将查询的列直接传入函数中,函数会优先取在关联表中存在数据的属性值
下面是一条示例 SQL 语句:
SELECT object_rel.*, COALESCE(object_a.name, object_b.name) AS name 
FROM object_rel 
LEFT JOIN object_a ON object_rel.object_id = object_a.id 
LEFT JOIN object_b ON object_rel.object_id = object_b.id 
ORDER BY name; 
查询结果如下:

SQL解读
解读一下上面的SQL:
-  
COALESCE 函数:
-  
使用
COALESCE函数来选择name。如果object_a 表中找不到对应的记录,则使用object_b 表中的name。 
 -  
 -  
LEFT JOIN:
-  
两个
LEFT JOIN分别连接object_a 表和object_b 表,以确保能从任意一个表中获取对应的name。 
 -  
 -  
ORDER BY:
-  
根据
name字段进行排序。 
 -  
 
这样就可以获得 object_rel 表的数据,并根据object_a表的name或object_b表的name进行排序了,同时如果想要增加某一张的表条件过滤,可以直接使用WHERE条件拼接即可。
本次分享到此,我们下期见!


















