2011-12-08 51 views
1

我正在使用MySQL數據庫。我必須建立一個接受整型參數的存儲過程。取決於整數的價值,我必須「ORDER BY」不同的值這樣的..排序方式是升序和降序的情況

**if(type == 1) than 
order by Date Desc, 
Quantity asc, 
Amount asc 

else if(type == 2)than 
order by Date ASc, 
Quantity asc, 
Amount asc 


else if(type == 3)than 
order by 
Quantity asc 
Date desc, 
Amount asc 

但是當我嘗試這個我無法做到這一點它也給了錯誤。

+0

什麼錯誤?你在這裏忘了 – Pratik

+0

你會得到什麼錯誤? (我認爲那些**不屬於那裏) – Ruben

+0

鏈接在哪裏?以及它給編譯時錯誤我的sp沒有編譯...... –

回答

1

嗯,我終於得到了解決....

SELECT distinct 


order_detail.*, -(1)*CAST(order_detail.Date as unsigned) as lOrderDate, 

from order_detail 

order by 

CASE 
WHEN type = 1 THEN lOrderDate 
WHEN type = 2 THEN order_detail.Date 
WHEN type = 3 THEN order_detail.Quantity 

END, 

CASE 
WHEN type = 1 THEN order_detail.Quantity 
WHEN type = 2 THEN order_detail.Quantity 
WHEN type = 3 THEN lOrderDate 

END, 

CASE 
WHEN type = 1 THEN order_detail.Amount 
WHEN type = 2 THEN order_detail.Amount 
WHEN type = 3 THEN order_detail.Amount 

END; 
+0

+1有趣的解決方案。 – Devart

+0

確保你[profile](http://serverfault.com/questions/3120/)查詢並檢查[query plan](http://dev.mysql.com/doc/refman/5.1/en/execution -plan-information.html)。 MySQL不會利用這種方法使用索引,這會對性能產生負面影響。 – outis

+0

你是什麼意思? –

2

如果您查看SELECT的語法,您會看到ORDER BY子句不能出現在CASE語句中。

如果某列是數值類型,則可以編寫一個表達式,升序爲1,降序爲-1,表達式乘以列進行排序,但這會影響性能,因爲MySQL將無法執行使用任何指數的排序。

SELECT ... 
    ORDER BY IF(?='d', -1, 1) * value 

一般來說,您必須使用不同的語句才能獲得不同的順序。

0

兩種方式:

  1. 構建查詢 - 就像一個字符串,然後用prepared statements來執行它。
  2. 使用IF-ELSEIF-END IF語句來執行三個不同的SELECT查詢。
+0

我不想寫代碼,如果我不得不重複我的邏輯 –

+0

outis建議一種數字類型的好方法。但對於具體的訂購和其他數據類型(不能轉換爲數字) - 我認爲你沒有選擇;-) – Devart

相關問題