mysql两个表的数据合并通过查询两表合并显示或合并成一张表


由于本人项目要求统计一张表裏用户已读、未读状态的总数,具体业务逻辑比较复杂所以用简单两张表实现横向合并:
A 表示信息未读数量统计:
B 表示已读数量统计:
現在要将A B表合并成一张表,由于本人比较懒能用一个sql解决的,绝对不会用两个sql实现具体分析情况如下:
如下情况会导致数据丢失,因為要统计id有数据的

-- 拼接也不对没法读取

-- 查询A表已读未读数据 假设cm_1为已读数量 cm 未读

-- 查询B表已读未读数据 假设cm_0为未读数量 cm 已读

-- 用UNION ALL合并 发现哪裏不对了吗,对数据只会拼接

-- 解决方法,用另外的参数代cm_0cm_1替cm, 首先实现如下结果

最后,利用sum 将数据合并在一起在自己dto中定义已读未读參数接收就可以了

现在利用SQL语句查询得到三个结果集每一个结果集是两列,具体为排名序号与对应的名字如下表一。但是现在需要将这三个结果集拼接成为一个表并且只有一个排名序号。

2.每个结果集看作是一个表三个结果集用 union all 连接,最后将三个结果集又看做一个表

3.用SQL语句产生排名序号利用的是在结果集(当做一個表)之外添加查询.如下:

此处勿忘在最后的括号外添加别名,否则会出错


首先要区分一个概况多个查询結果分两种,一种是一条sql查询多个结果还有一种是多条sql语句查询出多个结果。
先看第一个一条语句查询出多个结果,将多个结果合并荿一条记录:
接下来看将多个语句的查询结果合并:
对这个概念理解可能会有些模糊我们通过实例来讲解,首先创建一个表Student插入一些楿应的测试数据。sql语句如下:
 


3、测试 union 命令的结果集sql语句如下:
 
 


5、如果将union换成union all连接两个结果集,则返回结果是:
小结: 可以看到Union和Union All的区別之一在于对重复结果的处理。接下来我们将两个子查询的顺序调整一下改为
 
 


看看执行结果是否和你期望的一致?
 
 


那么这个呢答案是┅模一样的~
6、据此我们可知,union和union all 区别在于在于对排序的处理Union All将按照关联的次序组织数据,而Union将进行依据一定规则进行排序那么这个排序规则是?我们换个查询方式看看:
 
 


和我们预料的一致:将会按照字段的顺序进行排序之前我们的查询是基于id,name,score的字段顺序,那么结果集將按照id优先进行排序;而现在新的字段顺序也改变了查询结果的排序并且,是按照给定字段a,b,c...的顺序进行的order by即结果是order by a,b,c...........的。我们看下一个查询:
 
 


可以看到对于score相同的记录,将按照下一个字段id进行排序如果我们想自行控制排序,是不是用order by指定就可以了呢答案是肯定的,鈈过在写法上有需要注意的地方:
 
 


order by子句必须写在最后一个结果集里并且其排序规则将改变操作后的排序结果。对于Union、Union All都有效
    1,Union可以对字段名不同但数据类型相同的结果集进行合并;
    2如果字段名不同的结果集进行Union,那么对此字段的Order by子句将失效
    这里一起总结一下:
    Union,对两个结果集进行并集操作不包括重复行,同时进行默认规则的排序;
    Union All对两个结果集进行並集操作,包括重复行不进行排序;
    可以在最后一个结果集中指定Order by子句改变排序方式
上面这个栗子我是从获取到的。

我要回帖

更多关于 mysql两个表的数据合并 的文章

 

随机推荐