1

我想基于从另一个表顺序 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 看到了一些解决方案:如何在 asc 和 desc 中动态订购 2 个 SQL 字段

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

4

2 回答 2

3
order by if((select sorting from table2 where table2.id = ?) = 1,
  unix_timestamp(table.date), -unix_timestamp(table.date))

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

于 2012-10-25T18:12:50.390 回答
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 字段是数字,您采用的一个技巧(尽管我不确定它是否属于“最佳实践”阵营)是将 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
于 2012-10-25T18:11:19.597 回答