MariaDB如何实现按sold_at非空优先、rate降序的加权多字段排序
MariaDB如何实现按sold_at非空优先、rate降序的加权多字段排序
嗨,我来帮你搞定这个排序需求!你想要的是先把所有sold_at不为NULL的产品放在前面,然后在这两组(非空/空)里分别按rate降序排列,包括处理rate为NULL的情况对吧?
其实核心思路就是给sold_at非空的记录加一个更高的优先级权重,然后结合rate来做排序。直接用ORDER BY的多条件就能实现,不用复杂的CTE或者嵌套查询。
解决方案1:用CASE语句标记优先级
SELECT * FROM products ORDER BY -- 给sold_at非空的标记为1,空的标记为0,降序让非空的排前面 CASE WHEN sold_at IS NOT NULL THEN 1 ELSE 0 END DESC, -- 然后按rate降序排列,NULL会自动排在每组的最后 rate DESC;
解决方案2:用IF函数简化写法
如果你觉得CASE有点啰嗦,也可以用更简洁的IF函数,效果完全一样:
SELECT * FROM products ORDER BY IF(sold_at IS NOT NULL, 1, 0) DESC, rate DESC;
为什么你之前的方法不行?
- 你尝试的
SELECT * FROM products ORDER BY rate DESC, sold_at ASC:这个是先按rate降序,再按sold_at的日期升序,完全没有把“非空优先”作为第一优先级,所以不符合需求。 - 那个CTE的写法:CTE里的
ORDER BY其实不会生效(除非搭配LIMIT,但这里不需要),而且两次排序也不是按分组来的,自然达不到你要的效果。
用上面的SQL语句跑你的示例数据,就能得到你想要的结果:非空sold_at的产品排在前面,且按rate从高到低排,rate为NULL的在非空组最后;然后是sold_at为空的产品,同样按rate降序排列。
备注:内容来源于stack exchange,提问作者Paul-Marie
相关产品推荐
相关产品推荐

