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 条件排序方式的主要内容,如果未能解决你的问题,请参考以下文章