MySql中 union all 和 order by 一起使用的问题
最近使用SQL语句进行UNION查询,惊奇的发现:SQL没问题,UNION查询也没问题,都可以得到想要的结果,可是在对查出的结果进行union的时候,却出问题了(人要爆炸)。
from table_02
where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%'
order by ZBID,HC;
sql2:
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”是用程序生成出来的