关于mysql的union和ordery的组合使用

本文探讨了如何通过SQL查询实现复杂订单状态排序,包括待付款按生成时间升序,交易成功数据按生成时间倒序,同时确保预付款在前。详细解释了SQL查询语句的构造及为何在子句中需要配合limit使用orderby才能实现预期效果。

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

最近公司一个业务需要将订单列表根据每个状态的不同按时间正序倒序排列。
举个列子待付款的按生成时间升序,交易成功的按生成时间倒序且预付款的数据在前,成功的数据在后。订单表order

(select * from order where status =1 order by create_time asc)
union all
(select * from order where status =2 order by create_time desc)
注意:要打上括号不然会报错。因为union中,在不用括号的情况下,只能用一个order by。

按照我的本意,这条sql的执行顺序:顺序执行select * from order where status =1 order by create_time asc,select * from order where status =2 order by create_time desc,然后在union起来

可惜最后的结果却不是自己想要的,数据最终全部按asc排序出来的
百思不得其解,只好求助度娘,发现了一个句话

在子句中,order by 需要配合limit使用才有意义。如果不配合limit使用,会被语法分析器优化分析时去除。

最后一句,我只能说涨知识了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值