我对ORDER BY CASE进行了以下查询,但未返回预期结果
G
我要按以下顺序对产品进行排序
我期望上面的查询能够完成工作,但不能完成
我是否误解了mysql的情况?
我的方法完全错误吗?
任何帮助表示赞赏
答案 0 :(得分:2)
@Madhur正确地回答了他的评论问题,但是除了他说的话,您实际上还可以简化CASE
表达式:
SELECT c.*
FROM ws_products AS c
ORDER BY
CASE WHEN c.stock > 0 THEN 1
WHEN c.allow_backorder = 1 THEN 2
ELSE 3 END;
之所以可行,是因为如果库存不大于零,那么根据定义,库存量必须为零或更少,因此在随后的情况下我们无需显式检查。我假设我们可以在allow_backorder = 0
条件下存储ELSE
,假设0和1是那里唯一可能的值(如果不是,那么您原来的CASE
表达式应该具有自己的ELSE
条件)。
答案 1 :(得分:0)
替代方法:
ORDER BY
CASE WHEN c.stock>0 THEN 1
WHEN (c.stock<=0 AND c.allow_backorder=1) THEN 2
WHEN (c.stock<=0 AND c.allow_backorder=0) THEN 3 END asc
我更喜欢这种格式(条件列表):
ORDER BY
c.stock>0 DESC,
c.stock<=0 AND c.allow_backorder=1 DESC,
c.stock<=0 AND c.allow_backorder=0 DESC
现在我们可以对其进行优化(条件c.stock>=0
仅使用一次;假设c.allow_backorder是0
或1
)
ORDER BY c.stock <= 0, c.allow_backorder DESC