MySql中 union all 和 order by 一起使用的问题

最近使用SQL语句进行UNION查询,惊奇的发现:SQL没问题,UNION查询也没问题,都可以得到想要的结果,可是在对查出的结果进行union的时候,却出问题了(人要爆炸)。

sql1:
select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW
 from table_02
 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%'
 order by ZBID,HC;

sql2:

select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW
 from table_03
 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%'
 order by ZBID,HC;

然后呢业务需求是需要把这两个查询的结果union all(不使用union的原因是业务上不去掉重复数据)到一起,且数据的顺序不能变动

正确的结果应该是这样的   图1

然而当你写这个SQL的时候,select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_02 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC
union all
select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_03 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC

哎,报错了,神奇不!哈哈哈。Incorrect usage of UNION and ORDER BY : UNION和ORDER BY的用法不正确

如图

解决方法:在要union的查询用()(英文括号括住),例如

(select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_02 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC)
union all
(select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_03 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC)

结果如下

 图2

SQL没有报错是有结果的,不知有没有发现其实数据的顺序其实发生了变化的,注意图1和图2第二条数据,哎发现了吧,是不对了吧。那我就要说对不起了,不行查出的结果不满足我的需求(此时心中一万只草泥马奔驰而过),难道这个问题无解吗?

别慌,有的。

①(select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_02 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC limit 999)
union all
(select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_03 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC limit 999)

 但是有没有发现什么limit,对 你没有看错就是他,但是这种写法有局限性limit的条数有限。你不会说我可以增大limit的条数,你可以试试我不介意,等到数据量大的时候你就知道了

下面说下我采用的解决方法

 select a.*
 from (
(select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW,0 as PAIXU
 from table_02
 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%'
 order by ZBID,HC)
union all
(select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW,1 as PAIXU
 from table_03
 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%'
 order by ZBID,HC)
 ) a
 order by a.PAIXU,a.ZBID,a.HC;

有没有发现多了什么,就是它——“PAIXU”列,用它来给sql1和sql2的查询结果先排序,然后在按照sql1和sql2取数据的时候的字段排序(当然了至于是 asc 还是desc 那就看实际需求了),好就这样了。

悄悄说下我的“0 as PAIXU”和“1 as PAIXU”是用程序生成出来的

原文地址:https://www.cnblogs.com/bkyqtr/p/14548899.html