2013-01-21 63 views
4

我有一個表產品3列:
- id_product
- quantity_in_stock
- PRODUCT_NAME
如果某個列的某個值由另一個值排序,如何將查詢的行放在最下面?

我想有下令PRODUCT_NAME與quantity_in_stock的所有行我結果的底部,如果是= 0 。

我嘗試這樣做查詢,但它不工作:

(SELECT * 
FROM products 
WHERE quantity_in_stock != 0 
ORDER BY product_name ASC) 
UNION 
(SELECT * 
FROM products 
WHERE quantity_in_stock = 0 
ORDER BY product_name ASC) 

也許有做一個簡單的方法,但它星期一! )

+0

ORDER BY quantity_in_stock = 0? – Strawberry

+0

對不起,我現在改變了我的問題:我希望它按product_name排序。使用該查詢,我實際上可以通過quantity_in_stock分開產品,但它們不會按product_name排序! – Alex

+0

加油。看看你是否可以弄清楚如何解決這個問題。或者等待六秒鐘,然後全部交給你。 – Strawberry

回答

8

ORDER BY可以包含任意的表達,這樣就可以評價那些= 0併爲它們分配一個較高的值,該值後進行排序:

SELECT * 
FROM products 
ORDER BY 
    /* If quantity_in_stock is 0, assign a 1 otherwise 0. The ones sort after 0 */ 
    CASE WHEN quantity_in_stock = 0 THEN 1 ELSE 0 END ASC, 
    /* Then sub-order by name */ 
    product_name ASC 

由於MySQL的布爾評價返回1或0,可以的簡化如下。它不會的RDBMS工作,雖然在:

SELECT * 
FROM products 
ORDER BY 
    /* Will return 0 (false) for quantity_in_stock <> 0 and 1 if true */ 
    (quantity_in_stock = 0) ASC, 
    product_name ASC 

要小心的是,如果quantity_in_stock沒有被索引,查詢的性能會受到負面受此影響。

+1

,或者您可以通過ABS(SIGN(quantity_in_stock))命令'在這種情況下 – valex

+0

@valex是的,這將是聰明和便攜。 –

+0

@MichaelBerkowski第二個查詢就像一個魅力。 – Alex

相關問題