2011-12-08 15 views
1

私はMySQLデータベースを使用しています。私は、整数型のパラメータを受け入れるストアドプロシージャを作成する必要があります。私はこれをしようとすると、整数の値に応じて、私はこのような異なる値「によって順序」に持っている...ご注文は昇順と降順の場合

**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

[プロファイル](http://serverfault.com/questions/3120/)のクエリを確認し、[クエリプラン](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文を使用して、3つの異なるSELECTクエリを実行します。
+0

私は自分のロジックを反復しなければならないので、コードを書く必要はありません –

+0

outisは数値型のための良い方法を提案しています。しかし、特定の順序と他のデータ型(数値に変換することはできません) - 私はあなたが選択肢を持っていないと思う;-) – Devart

1

Dateがある場合は、このような適切なdateまたはdatetimeあなたが行うことができるもの:

ORDER BY 
    CASE type WHEN 3 THEN -1 * Date ELSE Date END asc, 
    Quantity asc, Amount asc 

http://dev.mysql.com/doc/refman/5.0/en/case-statement.html

datetimeや他のMySQLの日付と時刻タイプが内部的に保存されているので、これは動作します整数として:

http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

+0

よくこの良いかもしれない –

関連する問題