2017-06-05 13 views
1

私は$ varというPHP変数を持っています。 $ varに依存して結果を並べ替えたいMySQL - ORDER BY、CASE、DESC

$sql = " 
SELECT 
    myText1, 
    myText2, 
    someNumber 
FROM myTable 
ORDER BY 
    CASE 
     WHEN $var = 1 THEN myText1 
     WHEN $var = 2 THEN myText2 
     WHEN $var = 3 THEN someNumber 
    END"; 

をしかし、$ varは私がDESCsomeNumberでソートする必要が3のとき:この1は動作します。だから私はこれを試した:

$sql = " 
SELECT 
    myText1, 
    myText2, 
    someNumber 
FROM myTable 
ORDER BY 
    CASE 
     WHEN $var = 1 THEN myText1 
     WHEN $var = 2 THEN myText2 
     WHEN $var = 3 THEN someNumber DESC 
    END"; 

これは構文エラーをスローする。どうすればこれを達成できますか? 3つのcase式に

答えて

2

スプリットこの:

ORDER BY (CASE WHEN $var = 1 THEN myText1 END) ASC, 
     (CASE WHEN $var = 2 THEN myText2 END) ASC, 
     (CASE WHEN $var = 3 THEN someNumber END) DESC 

ASCはもちろん、オプションである - ちょうどDESCとそこに収縮します。

さらに重要なことは、これにより自動変換が削除されることです。 CASE式は1つの型のみを返します。異なるタイプを混在させると、ある種の変換が行われます。その変換は値の順序に影響します。この問題は修正されました。

+0

高速かつ正確な答えを最適化。ありがとうございました! :-) – MrPeperonny

0

使用数学:

ORDER BY 
CASE 
    WHEN $var = 1 THEN myText1 
    WHEN $var = 2 THEN myText2 
    WHEN $var = 3 THEN 1000000 - someNumber 
END 
0

CASEあなたは、いくつかの例がありますので、唯一、一つの発現を返すことができます。

CASE WHEN $var = 1 THEN myText1 END, 
CASE WHEN $var = 2 THEN myText2 END, 
CASE WHEN $var = 3 THEN someNumber END DESC 

OR、は

CASE 
    WHEN $var = 1 THEN myText1, 
    WHEN $var = 2 THEN myText2 
END, 
CASE WHEN $var = 3 THEN someNumber END DESC