MySql条件顺序由

ecs*_*rim 21 mysql sql sorting

我有这个表(简化):

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

我需要从表格中选择所有项目,这样订购:
1.价格> 0.00的商品,按价格ASC排序
2.价格= 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

感谢您的时间

Gab*_*oli 40

这样就可以了.

 SELECT * 
    FROM my_table 
    WHERE 1  
    ORDER BY 
      CASE price WHEN 0 THEN 1
       ELSE -1
      END ASC, price asc, id asc
Run Code Online (Sandbox Code Playgroud)

  • 这意味着当price为0时,为排序分配1,否则分配-1.只要THEN值大于ELSE值,任何两个值都可以工作. (3认同)
  • @Matthew 提到的。我们根据价格(0 或更大)为每一行(*of 1 或 -1*)赋予一个值,然后按该值排序。因此,带有 -1 的行将排在最前面(*价格 > 0 的行*),而带有 1 的行将排在最后(*价格 = 0 的行*)。 (2认同)

小智 20

您还可以使用以下内容:

SELECT * 
FROM my_table 
WHERE 1  
ORDER BY price=0, price, id;
Run Code Online (Sandbox Code Playgroud)

对于零价格的商品,零件'price = 0'将为1,对于具有非零价格的商品,零件将为0.由于默认排序顺序为ASC,因此现在首先放置非零项目.

order-by子句的下一位意味着非零项目按价格排序(再次升序).如果任何具有非零价格的商品具有相同的价格,它们将按ID进一步排序,但我们并不关心.

最后一部分仅适用于price = 0的项目.由于所有这些商品都具有相同的价格,因此效果是按ID对所有零价商品进行分类.