MySQL - ORDER BY,CASE和DESC

问题描述:

我有一个名为$ 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为3我需要someNumberDESC进行排序。所以我试过这个:

$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"; 

这一个抛出一个语法错误。我怎样才能做到这一点?

分为三个case表达这样的:

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收缩。

更重要的是,这会消除自动转换。 A CASE表达式只返回一种类型。当你混合不同的类型时,就会发生某种转换。该转换可能会影响值的排序。这解决了这个问题。

+0

快速而正确的答案。谢谢! :-) – MrPeperonny

使用数学:

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

情况下,只可以返回一个表情,这样你才会有几种情况:

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