【问题标题】:Double order in Mysql queryMysql查询中的双重订单
【发布时间】:2015-03-11 14:39:57
【问题描述】:

我的 SQL 查询中的 Ordering 存在一些问题。

我在“products”表中有 2 个字段(“price”和“in_stock”)。我想要做的是按这两个字段对我的查询结果进行排序 - 按“in_stock”而不是“price”。但是(!)一件重要的事情是将'in_stock'订购为布尔值。例如表格是:

Name       | Price | in_stock |
----------------------------------|
Product1   | 100   |    9     |
Product2   | 200   |    0     |
Product3   | 500   |    4     |
Product4   | 500   |    0     |
Product5   | 300   |    2     |

所以正确的订单结果是:

Product1 - 100, 9
Product5 - 300, 2
Product3 - 500, 4
Product2 - 200, 0
Product4 - 500, 0 

第一步 - 按库存订购产品 - 如果产品缺货,则必须在列表末尾。按价格对产品进行排序后 - 从低到高。

【问题讨论】:

  • 排序为布尔值你怎么看?您需要按整数对 in_stock 进行排序,正如我在您的“正确订单结果”中看到的那样
  • Stocks > 0 首先按价格升序排序... Stocks = 0 最后按价格排序。非常直接的请求...

标签: php mysql


【解决方案1】:

您可以在order by 子句中使用条件:

select name, price, in_stock
from yourtable
order by in_stock = 0, price

这将首先订购有库存的产品(无论有多少),然后按价格订购。


或者您可以使用 case 语句对结果进行排序:

order by case when in_stock > 0 then 0 else 1 end, price

【讨论】:

    【解决方案2】:

    您只需在 ORDER 子句中添加两列即可按两列排序:

    ORDER BY in_stock DESC, price ASC
    

    【讨论】:

    • 我认为这不是 OP 的要求。 one important thing is to order 'in_stock' as boolen
    【解决方案3】:

    排序不仅仅是添加 2 个 order 子句,它需要额外的 case-when 如下所示才能达到所需的结果集

    select * from table_name 
    order by case when in_stock = 0 then 1 else 0 end , price,in_stock desc ;
    

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多