2013-08-29 46 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