【问题标题】:Mysql query with multiple ORDER BY clause and IF conditions具有多个 ORDER BY 子句和 IF 条件的 Mysql 查询
【发布时间】:2017-07-10 14:43:32
【问题描述】:

我正在尝试根据订单表中的这些条件进行查询,

// This is not an actual query
SELECT *
IF (store_id = 3) THEN ORDER BY WEIGHT DESC, 
ELSEIF (STORE_ID = 7) THEN ORDER BY WEIGHT DESC
ELSEIF ORDER BY WEIGHT = DESC  
ELSEIF (EQUAL WEIGHT) ORDER BY ORDER_DATE DESC
ELSEIF (EQUAL WEIGHT AND EQUAL ORDER_DATE) ORDER BY STORE_ID DESC
ELSEIF (EQUAL WEIGHT AND EQUAL ORDER_DATE AND EQUAL STORE_ID) ORDER BY 
SHIPPING_METHOD DESC 
FROM TABLE orders WHERE carrier_name = 'XXX'

这是我所得到的,

//Actual query
SELECT id,store_id,weight 
FROM orders 
WHERE carrier_name = 'XXX'
ORDER BY 
IF(store_id = 3,weight,'')DESC,
IF(store_id = 3,order_date,'')DESC, 
IF(store_id = 3,store_id,'')DESC, 
IF(store_id = 3,shipping_method,'')DESC, 
IF(store_id = 7,weight,'')DESC, 
IF(store_id = 7,order_date,'')DESC, 
IF(store_id = 7,store_id,'')DESC, 
IF(store_id = 7,shipping_method,'')DESC,
IF(TRUE,weight,'')DESC,
IF(TRUE,order_date,'')DESC,
IF(TRUE,store_id,'')DESC,
IF(TRUE,shipping_method,'')DESC

得到的结果是

我不确定为什么 53.39 和 30.35 没有排序。我究竟做错了什么? 请建议是否有更好的方法来实现这一点。

这是需要的结果,

【问题讨论】:

  • 您将数字隐式转换为字符串(我认为)。为什么不使用 0 或 -10000 而不是 ''
  • 无论逻辑如何,您的第二个查询始终使用降序。那么这些检查有什么意义呢?
  • 使用 CASE 语句代替 If 条件。看到这个stackoverflow.com/a/2258402/5002793
  • @TimBiegeleisen 我必须先排序所有 store_id 3,然后是 store_id 7,然后是所有其他 store_id 。这就是我插入条件的原因。
  • 我再次更新了我的答案,以考虑到这一点。

标签: mysql


【解决方案1】:

根据您的预期输出,以下查询应为您提供所需内容:

SELECT *
FROM orders
WHERE carrier_name = 'XXX'
ORDER BY CASE WHEN store_id = 3 THEN 0
              WHEN store_id = 7 THEN 1
              ELSE 2 END,
         store_id,
         weight DESC

为了解释ORDER BY 子句中的逻辑,第一个条件将store_id 3 放在首位,然后是7,然后是其他所有内容。下一个条件按store_id 的升序对这三个组中的每一个进行排序。请注意,对于 3 和 7,第二步将被忽略,因为这些组的 store_id 值相同(分别为 3 和 7)。最后,第三个条件是按重量降序排列。

【讨论】:

  • 但是 mysql 中权重的数据类型是 FLOAT。还是我必须打字?
  • 您当前的排序顺序与weight 被视为文本而不是数字一致。
  • 我对查询中的所有权重属性使用 -> IF(store_id = 3,CAST(weight AS UNSIGNED),'')DESC 修改了查询。结果相同。
  • 不,我希望你使用我的查询,而不是你的。
  • 但是如何在该查询中添加 IF 条件。我之前也试过这个没有类型转换, SELECT store_id,weight -> FROM sales_orders WHERE store_id = 7 -> ORDER BY weight DESC;这工作正常。我也尝试过 UNION,但没有任何成功。
【解决方案2】:
ORDER BY 
  weight DESC, -- as i can see all true in your cases
  order_date DESC,
  store_id DESC,
  shipping_method DESC

【讨论】:

    猜你喜欢
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2018-11-28
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    相关资源
    最近更新 更多