sql将多个查询结果左右横向拼接
今天写springboot接口的时候遇到一个需求:查询多张表计算这些表的条数,然后将这些数据封装到一个对象中,这些表并没有相同的字段或其它的关联关系。这个问题咋一看觉得很简单,但实现起来却有点麻烦。
如果我们现在有两张表要装入模型对象
user表:
po_id | name | age |
---|---|---|
1 | 路飞 | 19 |
2 | 艾斯 | null |
3 | 萨博 | 21 |
fruit表:
num | melon | price |
---|---|---|
56452666 | apple | 120 |
26161616 | orange | 50 |
45816126 | null | 200 |
46164691 | watermelon | 40 |
public class MarketInfo {
@ApiModelProperty("人员数量")
private String companySum;
@ApiModelProperty("水果数量")
private String personSum;
}
单个表的数据我们是能一一查出来的,但是如果一个一个查的话,在Dao层我们就需要写多个dao的接口或者在一个接口中写多个方法,例如上面这个,如果是有两张表的话就需要在dao层接口中写两个方法分别为各个字段查询赋值,这样操作很麻烦,那么有没有简单的方法呢?
因为这些属性各对应一张表的统计数据,首先我们可能会想到连表查询,由于各个表之间没有相关联的字段因此,连表查询的条件无法满足,所以无论是内连接还是外连接都是行不通的。
也有人可能会想到用union对查询结果进行合并,但是union是对查询结果进行纵向上下合并而不是横向合并,请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。
如果我们这样写:
select count(*) A from user
union all
select count(*) B from fruit;
那么我们得到的结果将会是
查询的结果被合并成一列并且后面的字段名还没覆盖了
那么到底应该怎样写才能得到我们想要的结果呢?答案是使用子查询和联表查询相结合。
select * from
(select 1 id,count(*) A from user) X
left join
(select 1 id,count(*) B from fruit) Y
on X.id=Y.id
结果:
这里我们人为地为查询结果中添加一个id字段并且给这两个表的值都相同,这样我们就能够根据这个id字段进行连表查询了。
如果不行看到这个id,那么可以查那两个指定字段:
select A,B from
(select 1 id,count(*) A from user) X
left join
(select 1 id,count(*) B from fruit) Y
on X.id=Y.id
这样就完美地实现我们想要的效果了。
这个方法需要注意一点就是我们所查询到的结果行数一定要相等。