mysql union (all) 后order by的排序失效問題解決


上sql

select * FROM ( 
SELECT 
SUM(c.overtime_num) AS delay_num, 
ROUND((SUM(c.total_num) - SUM(c.overtime_num))*100/SUM(c.total_num),2) rate , 
'全網' as reaCodeFROM calc_vmap_repair_timely_rate_mon_stat c 
WHERE c.`type` = 22 
and c.MONTH BETWEEN '2019-01' AND '2019-01'
) t1 

UNION ALL 

SELECT t2.* FROM ( 
select tmp.* FROM ( 
SELECT SUM(c.overtime_num) AS delay_num, 
ROUND((SUM(c.total_num) - SUM(c.overtime_num))*100/SUM(c.total_num),2) rate , 
c.motorcade_area_code as reaCodeFROM calc_vmap_repair_timely_rate_mon_stat c 
WHERE c.`type` = 22 
and c.MONTH BETWEEN '2019-01' AND '2019-01' 
group by c.motorcade_area_code 
) tmp order by tmp.rate asc 
)  t2 

單獨執行union all下面的結果如下:

單獨執行union all上面的結果如下:

 

 

為了保證排序不亂,按照網上解決方案:

可是結果竟然還是:

 沒能解決問題。 加上limit問題也是可以解決的。

真正解決方案:

SELECT * FROM(

SELECT 
SUM(c.overtime_num) AS delay_num, 
ROUND((SUM(c.total_num) - SUM(c.overtime_num))*100/SUM(c.total_num),2) rate , 
'全網' AS reaCode,
0 AS od
FROM calc_vmap_repair_timely_rate_mon_stat c 
WHERE c.`type` = 22 
and c.MONTH BETWEEN '2019-01' AND '2019-01'

UNION ALL 

SELECT SUM(c.overtime_num) AS delay_num, 
ROUND((SUM(c.total_num) - SUM(c.overtime_num))*100/SUM(c.total_num),2) rate , 
c.motorcade_area_code AS reaCode,
1 AS od
FROM calc_vmap_repair_timely_rate_mon_stat c 
WHERE c.`type` = 22 
and c.MONTH BETWEEN '2019-01' AND '2019-01' 
group by c.motorcade_area_code 

) con ORDER BY od, rate;

先查詢后排序

union 前的排序與union 后的順序,采用加一個字段od來保證,然后再按rate排序則解決了以上的問題。

 


免責聲明!

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



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