如何先展示当日订单再按常规排序且避免日期重复?
实现当日订单优先展示且无重复的SQL排序方案
要达成你要的效果——先展示指定日期(示例:2024-04-06)的订单,再按原逻辑排序其余非当日订单且无重复,只需要在原SQL的ORDER BY中新增一个优先级判断字段,把当日订单单独归为一组排在最前面即可。
修改后的SQL代码
SELECT l.id as location_id, l.name, lo.id, lo.start_time, lo.end_time, lo.leader_id, lo.is_storno, lo.storno_at, lo.storno_by, lo.employees_need, lo.created_at FROM location_orders lo INNER JOIN location l ON l.id = lo.location_id WHERE lo.tenant_id = $1 AND lo.deleted_by IS NULL ORDER BY -- 优先展示当日订单,0代表优先级更高 CASE WHEN DATE(lo.start_time) = '2024-04-06' THEN 0 ELSE 1 END, -- 每组内部保持原有的排序逻辑 lo.start_time DESC LIMIT 50;
关键说明
- 优先级分组:通过
CASE语句把当日订单标记为0,非当日标记为1,排序时0会排在1前面,确保当日订单先展示。 - 无重复保证:第二组的订单是被
CASE语句排除了当日的,所以不会出现当日订单在后续结果中重复的情况。 - 动态当日日期:如果不需要写死日期,而是取系统当前日期,可根据你的数据库类型替换:
- MySQL:
DATE(lo.start_time) = CURDATE() - PostgreSQL:
DATE(lo.start_time) = CURRENT_DATE - SQL Server:
CAST(lo.start_time AS DATE) = CAST(GETDATE() AS DATE)
- MySQL:
内容的提问来源于stack exchange,提问作者oemer ok
相关产品推荐
相关产品推荐

