如何在ORDER BY if语句中使用ASC / DESC?

时间:2012-01-02 19:57:58

标签: mysql sorting

问题是:“如何使用if值通过sql语句进行排序?”

我有一个表,其中我有一个参数并使用这些参数我必须通过ASC或DESC订购一个列。我怎样才能实现它?

我已经理解ASC和DESC参数不能在IF块中(并且具有类似这样的结构。“IF(Type ='1',排名,排名)ASC / DESC”),所以这是在select in base中对一个参数进行排序的替代方法?

示例

表格如下:

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

Type = 1必须是ASC顺序,Type = 2必须是DESC顺序,因此SELECT的预期结果可能是:

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

有什么想法吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

按类型排序后按IF(type=2, -ranking, ranking)排序怎么样?否定排名将导致该类型的相反顺序。

修改

由于rankingVARCHAR列,您需要将其转换为数字才能使用此技术。

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

您可以直接在sqlfiddle

测试代码

答案 2 :(得分:-1)

不确定你得到的是什么:“......在一个基础选择中订购一个参数。” - 你不小心在那里说了几句话。

但如果这有帮助,您可以通过以下多个字段进行排序:

... ORDER BY type ASC, ranking DESC

按衍生值排序:

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

将首先放置所有“ranking = 2”记录,然后将任何其他排名记录升序。