排序方式,在保持升序搜索顺序的同时将0放在最后

时间:2012-06-13 19:46:12

标签: mysql

我有一个使用ORDER BY ASC的查询,因此0首先出现。我希望他们能够在保持升序搜索顺序的同时达到最后。我怎样才能做到这一点?

这方面的一个例子是:

SELECT product_price ORDER BY product_price ASC

所以而不是

0
1
2
3

我想要

1
2
3
0

3 个答案:

答案 0 :(得分:3)

我没有MySQL进行测试,但这适用于SQL Server和Advantage Database Server:

SELECT 
  product_price 
ORDER BY 
  CASE product_price WHEN 0 then 99999999 ELSE product_price END

99999999系列替换为product_price列类型的最大值。

答案 1 :(得分:2)

SELECT product_price FROM tablename ORDER BY IF(product_price=0,4294967295,product_price) ASC

答案 2 :(得分:1)

为获得最佳效果,请使用union

(
    SELECT
        *
    FROM
        products
    WHERE
        product_price > 0
    ORDER BY
        product_price ASC
)
UNION
(
    SELECT
       *
    FROM
        products
    WHERE
       product_price = 0
)

替代方案,使用filesort,当你有大表时,它可能会非常慢。

EXPLAIN SELECT
    *
FROM
    products
ORDER BY
    IF(product_price = 0, 1, 0) ASC
    ,product_price ASC

yeilds Using filesort。这意味着临时表正在磁盘上写入。当你处理大量查询时非常慢。