mysql ORDER BY CASE中未返回预期结果

时间:2019-09-24 08:28:22

标签: mysql sql-order-by

我对ORDER BY CASE进行了以下查询,但未返回预期结果

G

我要按以下顺序对产品进行排序

  • 首先具有库存(c.stock> = 0)的产品
  • 第二种没有库存但有allow_backorder的产品 已启用(c.stock <= 0和c.allow_backorder = 1)
  • 最后没有库存和没有产品 启用allow_backorder(c.stock <= 0和c.allow_backorder = 0)

我期望上面的查询能够完成工作,但不能完成

我是否误解了mysql的情况?

我的方法完全错误吗?

任何帮助表示赞赏

2 个答案:

答案 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是01

ORDER BY c.stock <= 0, c.allow_backorder DESC
相关问题