【问题标题】:MySql conditional order byMySql 条件排序方式
【发布时间】:2011-01-16 12:48:45
【问题描述】:

我有这张表(简体):

CREATE TABLE `my_table` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `item_name` VARCHAR(45) NULL ,
  `price` DECIMAL(10,0) NULL ,
  PRIMARY KEY (`id`) 
)

我需要从表中选择所有项目,以这种方式排序:

  1. price > 0.00 开头的项目,由price ASC 订购
  2. 最后带有price = 0.00 的项目,由id 订购

我试过了:

SELECT * 
FROM my_table 
WHERE 1  
ORDER BY 
  CASE price WHEN !0.00 THEN price 
   ELSE id
  END 
ASC

我得到类似的结果

item_name price
foo 150,00
bar 0,00
baz 500,00
hum 0,00

如何构建查询以拥有

item_name price
foo 150,00
baz 500,00
bar 0,00
hum 0,00

感谢您的宝贵时间

【问题讨论】:

    标签: sql mysql sorting


    【解决方案1】:

    这样就可以了..

     SELECT * 
        FROM my_table 
        WHERE 1  
        ORDER BY 
          CASE price WHEN 0 THEN 1
           ELSE -1
          END ASC, price asc, id asc
    

    【讨论】:

    • 太好了,非常感谢!一个问题,THEN 和 ELSE 中的 1 和 -1 是什么意思?
    • 表示当price为0时,排序为1,否则为-1。只要 THEN 值大于 ELSE 值,任何两个值都可以。
    • @Matthew 提到的内容。我们根据价格(0 或更大)为每一行赋予一个值(of 1 或 -1),然后按该值排序。因此,带 -1 的行将排在第一位(价格 >0 的行),带 1 的行将排在最后(价格 = 0 的行)。
    【解决方案2】:

    您还可以使用以下内容:

    SELECT * 
    FROM my_table 
    WHERE 1  
    ORDER BY price=0, price, id;
    

    对于零价格的商品,“价格=0”部分将为 1,对于非零价格的商品,该部分将为 0。由于默认排序顺序是 ASC,因此现在首先放置非零项目。

    order-by 子句的下一位表示非零项目然后按价格排序(再次升序)。如果任何非零价格的商品价格相同,它们将进一步按 id 排序,但我们不在乎。

    最后一部分仅适用于价格=0 的商品。由于所有这些商品的价格都相同,因此效果是按 id 对所有零价格商品进行排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多