【问题标题】:How use ASC/DESC inside a ORDER BY if statement?如何在 ORDER BY if 语句中使用 ASC/DESC?
【发布时间】:2012-01-02 19:57:58
【问题描述】:

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

我有一个表,其中有一个参数,使用此参数我必须按 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

Type = 1 必须是 ASC 订单,Type = 2 必须是 DESC 订单,所以我的 SELECT 的预期结果可能是:

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

有什么想法吗?

【问题讨论】:

  • 你的意思是你有一个带参数的存储过程?它看起来像什么?
  • 如果不存在则创建表test (idsmallint(5) unsigned NOT NULL AUTO_INCREMENT, ranking varchar(15) NOT NULL, type tinyint(1) unsigned NOT NULL,主键 (id) ) ENGINE=InnoDB 默认字符集=utf8 AUTO_INCREMENT=5 ;插入test (id, ranking, type) 值 (1, '12', 1), (2, '10', 1), (3, '14', 2), ( 4, '15', 2);

标签: mysql sorting


【解决方案1】:
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】:

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

    编辑

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

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

    您可以直接在sqlfiddle测试代码

    【讨论】:

    • 我已经尝试过您的解决方案,但它不起作用...结果是一样的有或没有 -
    • SELECT * FROM test ORDER BY type ASC, IF(type = 1, ranking, -ranking) ASC。结果是 14/15 而不是 15/14。
    • 奇数。我刚刚使用您发布的相同数据创建了一个测试表,并且得到了预期的结果。
    • 使用我上面发布的相同数据和相同查询?
    • 哎呀。我没有注意到rankingVARCHAR。对于那个很抱歉。现在更新我的答案。虽然有什么理由不能使用INT
    【解决方案3】:

    不知道你在做什么:“......在一个选择的基础上对一个参数进行排序。” - 你不小心在那儿说了几句话。

    但如果这有帮助,您可以像这样按多个字段排序:

    ... ORDER BY type ASC, ranking DESC
    

    并按派生值排序:

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

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

    【讨论】:

    • 查看预期输出。排名顺序取决于类型。
    • 是的,排名列只能用作“order by”的条件,而不是订单本身。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2019-06-09
    • 2018-09-14
    • 2014-11-20
    相关资源
    最近更新 更多