mysql+union+怎么排序,mysql 使用union(all) + order by 导致排序失效

本文讨论了在MySQL中使用UNION合并查询结果时,ORDER BY子句可能失效的问题,导致数据排序不符合预期。通过示例SQL查询展示了在UNION查询中,查询结果的smoke_number顺序与单独查询时不同。解决方法是在每个子查询中添加LIMIT限制返回的行数,从而确保排序的正确性。最后给出了修正后的SQL语句,成功解决了排序问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、SQL1如下

SELECT

aa.*

FROM

apas_smoke aa

WHERE

STATUS = 0

AND aa.area_id = 'd61523dda339441f80008634c6b91f60'

AND aa.type = '3'

AND to_days( create_time ) = to_days(

now())

ORDER BY

CAST( aa.smoke_number AS UNSIGNED ) ASC

查询结果如下,smoke_number 顺序为3,4

54e6a201a3f10688f85ba80d559550d9.png

2、sql2如下:

SELECT

bb.*

FROM

apas_smoke bb

WHERE

bb.STATUS = 0

AND bb.area_id = 'd61523dda339441f80008634c6b91f60'

AND bb.type = '1'

AND to_days( create_time ) = to_days(

now())

ORDER BY

CAST( bb.smoke_number AS UNSIGNED ) ASC

查询结果如下,smoke_number顺序为1,2

45619d889c7ac1ab0015509218144026.png

3、但是当使用UNION后,SQL如下

( SELECT

aa.*

FROM

apas_smoke aa

WHERE

STATUS = 0

AND aa.area_id = 'd61523dda339441f80008634c6b91f60'

AND aa.type = '3'

AND to_days( create_time ) = to_days(

now())

ORDER BY

CAST( aa.smoke_number AS UNSIGNED ) ASC

) UNION

(

SELECT

bb.*

FROM

apas_smoke bb

WHERE

bb.STATUS = 0

AND bb.area_id = 'd61523dda339441f80008634c6b91f60'

AND bb.type = '1'

AND to_days( create_time ) = to_days(

now())

ORDER BY

CAST( bb.smoke_number AS UNSIGNED ) ASC

)

查询结果,如下,smoke_number顺序与3,4,2,1  与预期的顺序  3,4,1,2不一致。

f2a2adff63dae6edb817c5d61a5f51ef.png

**原因:union(all)会使order by失效,解决办法,加limit

4、最终SQL

(

SELECT

aa.*

FROM

apas_smoke aa

WHERE

STATUS = 0

AND aa.area_id = 'd61523dda339441f80008634c6b91f60'

AND aa.type = '3'

AND to_days( create_time ) = to_days(

now())

ORDER BY

CAST( aa.smoke_number AS UNSIGNED ) ASC

LIMIT 2

)

UNION

( SELECT

bb.*

FROM

apas_smoke bb

WHERE

bb.STATUS = 0

AND bb.area_id = 'd61523dda339441f80008634c6b91f60'

AND bb.type = '1'

AND to_days( create_time ) = to_days(

now())

ORDER BY

CAST( bb.smoke_number AS UNSIGNED ) ASC

LIMIT 2

)

查询结果:

0a665ae93ab5e7a2e37e67911f6c2ab3.png

问题解决。

标签:aa,bb,union,days,number,smoke,mysql,id,order

来源: https://www.cnblogs.com/lansetuerqi/p/13986528.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值