【问题标题】:MySQL ORDER BY depending on CASE order ASC or DESCMySQL ORDER BY 取决于 CASE 顺序 ASC 或 DESC
【发布时间】:2012-10-25 18:07:05
【问题描述】:

我要基于从另一个表顺序 ASC 或 DESC 查询的值。

所以是这样的:

SELECT *
FROM table
ORDER BY 
    CASE (SELECT sorting from table2 WHERE table2.id = ?)
        WHEN 1 THEN table.date ASC END 
        WHEN 0 THEN table.date DESC END
    END

在 MySQL 中有类似的东西吗?

我已经为 MS-SQL Server 看到了一些解决方案:how to order 2 SQL Fields in asc and desc dynamically

编辑:我刚刚看到我在描述中犯了一个错误,已修复。

【问题讨论】:

    标签: mysql case


    【解决方案1】:
    order by if((select sorting from table2 where table2.id = ?) = 1,
      unix_timestamp(table.date), -unix_timestamp(table.date))
    

    如果您的列是数字,则否定有效。如果它是一个字符串,你也许可以找到另一个函数来将高值映射到低值......

    【讨论】:

    • 这根本不正确。这家伙想按不同的字段对不同的表格进行排序。从问题中可以看出,字段排序的值只有 0 或 1,因此通过排序或 -sorting 进行排序是没有用的
    • 不,该字段的值实际上是 date 值,而不是 0 或 1,因此这种技术可能很有用。 +1 是一种创造性的、开箱即用的替代方案。
    • @NedretRecep 你看错了,table2排序只能是0或者1,table排序不一样
    • @xception,完全正确。那么提供的答案如何正确工作。所以我们有一个“table2”,其中一个字段“sorting”是0或1。然后根据这个字段的值,另一个名为“table”的表,其中一个名为“date”的日期类型字段正在升序或降序排序。并且给定的答案(我现在看到它被接受为奇怪的工作)是不正确的,因为它从来没有在任何地方设置字段“table.date”的排序
    • @NedretRecep 恕我直言,您实际上是没有正确解释问题的人。目的不是对 0/1 值进行排序,而是针对第一个表中的 0/1 值来驱动 second 表中排序的升序/降序方向。这正是公认的解决方案所做的。认为您只是没有完全正确地解释它。
    【解决方案2】:

    T-SQL 语句不能按照您建议的方式有条件地构造。

    您需要将查询构造成 varchar,然后对构造的字符串执行 EXEC,如下所示:

    Declare @QueryString varchar(100)
    Declare @Direction int
    
    Select @direction = sorting
      from table2
     where table2.id=? //from your original, not clear how you are providing it
    
    Set @QueryString = 'Select * from table order by yourField ' + case when @direction=1 then 'ASC' else 'DESC' end
    
    Exec (@QueryString)
    

    编辑假设您的 order_by 字段是数字,您采用的一个技巧(尽管我不确定它是否属于“最佳实践”阵营)是将订单的值乘以字段 -1 以反转默认顺序,例如

    Select @Direction = sorting
      from table2
     where table2.id=? 
    
    Select * 
      from table
      order by (case when @direction=1 then -1 else 1 end) *yourField
    

    【讨论】:

    • 使用 t-sql 的不是微软
    • 爆炸。误读了 OP 的帖子,认为他需要 T-SQL 解决方案。
    猜你喜欢
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2020-03-09
    • 2011-02-22
    • 1970-01-01
    相关资源
    最近更新 更多