2012-01-02 37 views
1

質問:「if値を使用してSQL文をどのように注文できますか?」ORDER BY if文の中でASC/DESCを使用する方法は?

私にはパラメータがあり、このパラメータを使用してASCまたはDESCで単一列を注文する必要があります。どうすれば達成できますか?

私は、ASCとDESCのパラメータはIFブロック内にあることができないことを理解しています(IF(Type = '1'、Ranking、Ranking)ASC/DESC)。パラメータの基数を選択するための代替案

表であるようなもの:

ID | RANKING | TYPE 
-------------------- 
1 | 12 | 1 
2 | 10 | 1 
3 | 14 | 2 
4 | 15 | 2 

タイプ= 1 ASC順序およびタイプ= 2 DESC注文しなければならないでなければならないので、予想される結果は私のSELECTの:

ID | RANKING | TYPE 
-------------------- 
2 | 10 | 1 
1 | 12 | 1 
4 | 15 | 2 
3 | 14 | 2 

それについてのアイデア?

+0

で直接コードをテストすることができますか?それはどのように見えるのですか? –

+0

ず 'test'( ' id' SMALLINT(5)符号なしNOT NULL AUTO_INCREMENT、 'ranking' VARCHAR(15)NOT NULL、 ' type'がTINYINT(1)符号なしNULL NOT、 PRIMARY KEYを(存在する場合のCREATE TABLE 'id') )ENGINE = InnoDB DEFAULT CHARSET = utf8 AUTO_INCREMENT = 5; INSERT INTO 'test'(' id'、 'ranking'、' type'が)が(2、 '10' 1) (1、 '12'、1)、 値、 (3、'14 '、2)、 (4,15'、2); – Gabriele

答えて

2

タイプ別にご注文後、IF(type=2, -ranking, ranking)で注文するのはどうですか?ランキングを否定すると、そのタイプの反対の注文が発生します。

EDIT

rankingVARCHAR列ですので、あなたは、この手法を使用する番号に変換する必要があるでしょう。

SELECT * FROM test ORDER BY type ASC, CAST(ranking as SIGNED)*IF(type = 1, 1, -1) ASC; 

あなたは、あなたがパラメータを指定してストアドプロシージャを持っているわけでくださいsqlfiddle

+0

私はあなたのソリューションを試しましたが、動作しません...結果は同じでもなくても同じです - – Gabriele

+0

試した完全なSQLを投稿できますか? –

+0

SELECT * FROM 'test' ORDER BY ASC、IF(タイプ= 1、ランキング、ランク)ASC。結果は14/15であり、15/14ではありません。 – Gabriele

-1

「あなたは何を得ているのかわかりません。 - あなたは間違ってそこにいくつかの言葉を。

しかし、このことができます場合は、このような複数のフィールドで注文することができます:派生値で

... ORDER BY type ASC, ranking DESC 

と順序:まず第一に、「ランキング= 2」のレコードを置きます

... ORDER BY IF(ranking = 2, 1, 0) DESC, ranking ASC 

他のランク付けされたレコードは昇順になります。

+0

予想される出力を参照してください。順位付けの順番は、種類によって異なります。 –

+0

はい、ランキング列はオーダー自体ではなく、「オーダー・バイ」の条件としてのみ使用する必要があります。 – Gabriele

4
ORDER BY type 
     , CASE WHEN type = 1 
       THEN ranking 
       ELSE NULL    --- implied, this line can be omitted 
             --- or changed into: ELSE '' 
             --- or: ELSE someConstant 
     END 
     , ranking DESC 
+2

+1これは私の答えよりも本当に良いです。 –

関連する問題