MySql 条件排序方式

Posted

技术标签:

【中文标题】MySql 条件排序方式【英文标题】:MySql conditional order by 【发布时间】: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`) 
)

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

    price > 0.00 开头的项目,由price ASC 订购 最后带有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

感谢您的宝贵时间

【问题讨论】:

【参考方案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 对所有零价格商品进行排序。

【讨论】:

以上是关于MySql 条件排序方式的主要内容,如果未能解决你的问题,请参考以下文章

mysql约束

mysql约束

mysql约束

MySQL约束

MySQL约束

MySQL查询基础