2013-08-29 75 views
2

我在想如果有更高級的方式在mysql查詢中使用ORDER BYmysql ORDER BY IF else

我有查詢從數據庫中獲取產品,使用價格順序。 問題是,如果折扣價值不爲零,它會覆蓋主要價格,並且它應該以某種方式覆蓋ORDER BY行。

IDEA:

DESC 

product_price discount 
900   0 
800   0 
1200   700 //dicount overrides price 
600   0 



查詢得到了25線,但邏輯是這樣的:

SELECT 
product_price as price, 
IFNULL(discount_amount,0) as discount 

FROM not_relevant 

WHERE not_relevant 

ORDER BY product_price DESC 

所以,當我寫的產品按價格分類排序,某些產品有折扣,所以主要價格被覆蓋,僅按價格排序並不準確。

我試圖用​​3210或兩個ORDER BY

任何想法? 感謝您的幫助。

+0

你要什麼你的結果是什麼樣子?您的措詞不清楚 – gvee

+0

默認按價格排序,但如果折扣不爲空使用折扣價值而不是價格值,則希望其更清楚。 – JTC

回答

3

我認爲這應該爲你工作:

SELECT 
product_price, 
IFNULL(discount_amount,0) as discount, 
IFNULL(discount_amount,product_price) as price 

FROM not_relevant 

WHERE not_relevant 

ORDER BY price DESC 

,它基本上是你問.. 。如果discount不爲空,則使用它,否則使用product_price,並對結果進行排序。

+0

'discount'不是原始查詢中字段的名稱。如果你想使用別名列'discount',那麼這個值永遠不會爲NULL – gvee

+2

我已經更新了我的答案... – Zagor23

2

這可以用來如果折扣實際上是折扣價,而不是打折量

SELECT product_price as price, 
IFNULL(discount_amount,0) as discount 

FROM not_relevant 
    ORDER BY 
CASE WHEN discount_amount IS NULL THEN price ELSE discount_amount END 
1
SELECT product_price As price 
    , Coalesce(discount_amount, 0) As discount 
    , Coalesce(discount_amount, product_price) As order_by_this 
FROM not_relevant 
WHERE not_relevant 
ORDER 
    BY order_by_this 

或者:

SELECT product_price As price 
    , Coalesce(discount_amount, 0) As discount 
FROM not_relevant 
WHERE not_relevant 
ORDER 
    BY Coalesce(discount_amount, product_price) 
+0

我認爲coalesce是僅限於oracle的,很好理解它的更常見,更好的想法 – skv

+2

@skv: 'COALESCE()'是ANSI標準的SQL,幾乎可以在所有數據庫中使用。 –

+1

@skv'Coalesce()'是ANSI/ISO(對不起,忘了是哪個)標準函數。只有一個原因,你應該總是使用這個特定於供應商的選項 – gvee