MySQL多字段排序中如何添加日期条件实现指定排序逻辑?
实现带条件的多字段排序:将指定日期的无销量图片置于有销量图片之后
原SQL语句按销量(sales)降序、浏览量(viewcount)降序对io__image表排序:
SELECT io__image.sales, io__image.viewcount, io__image.date FROM io__image ORDER BY io__image.sales DESC, io__image.viewcount DESC;
你的需求是把date >= '2022-05-01'的无销量图片,放在所有有销量图片之后、其余无销量图片之前,这完全可以通过带条件的多字段排序实现,调整后的SQL如下:
SELECT io__image.sales, io__image.viewcount, io__image.date FROM io__image ORDER BY io__image.sales DESC, -- 控制无销量图片的分组顺序:符合日期条件的排在其他无销量图片前面 CASE WHEN io__image.sales = 0 AND io__image.date >= '2022-05-01' THEN 0 WHEN io__image.sales = 0 THEN 1 ELSE 0 -- 有销量的图片不参与这个分组排序,不影响原有顺序 END ASC, io__image.viewcount DESC;
排序逻辑说明:
- 第一优先级:
sales DESC,确保所有有销量(sales > 0)的图片排在最前面,无销量(sales = 0)的图片整体靠后 - 第二优先级:通过
CASE语句生成的分组值,按升序排序:- 符合日期条件的无销量图片标记为
0,排在无销量组的前面 - 其他无销量图片标记为
1,排在无销量组的后面
- 符合日期条件的无销量图片标记为
- 第三优先级:
viewcount DESC,保持同组内按浏览量降序排序的原有规则
效果验证
调整后会得到你预期的排序结果:
+-------+-----------+---------------------+ | sales | viewcount | date | +-------+-----------+---------------------+ | 5 | 7 | 2021-04-21 19:13:21 | | 4 | 186 | 2018-05-09 13:45:40 | | 4 | 135 | 2018-05-11 17:22:30 | | 3 | 157 | 2018-05-02 09:47:48 | | 1 | 8 | 2021-08-29 11:22:55 | | 1 | 7 | 2021-06-21 12:26:32 | | 1 | 5 | 2021-06-21 12:40:38 | | 1 | 4 | 2021-06-14 15:15:01 | | 0 | 10 | 2022-07-14 12:11:25 | | 0 | 5 | 2022-06-21 08:45:43 | | 0 | 824 | 2021-04-21 22:12:48 | | 0 | 430 | 2020-11-27 13:46:59 | | 0 | 228 | 2017-10-24 09:05:40 | | 0 | 209 | 2019-11-24 11:32:43 | | 0 | 184 | 2018-05-02 21:26:40 | | 0 | 174 | 2018-05-02 21:21:20 | | 0 | 174 | 2018-05-03 09:08:53 | | 0 | 171 | 2018-05-02 09:20:34 |
内容的提问来源于stack exchange,提问作者London Smith
相关产品推荐
相关产品推荐

