MySQL ORDER BY取决于CASE订单ASC或DESC

时间:2012-10-25 18:07:06

标签: mysql case

我希望基于从另一个表顺序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

编辑:我刚刚看到我在说明中弄错了,修复了。

2 个答案:

答案 0 :(得分:3)

order by if((select sorting from table2 where table2.id = ?) = 1,
  unix_timestamp(table.date), -unix_timestamp(table.date))
如果您的列是数字,则

否定有效。如果它是一个字符串,您可能能够找到另一个函数来将高值映射到低值......

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