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条件拼接即可。
本次分享到此,我们下期见!