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”是用程序生成出來的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM