MySql查询结果的ORDER BY方向不同

Nor*_*o23 4 mysql sql-order-by

我正在尝试对我无法弄清楚的 mysql 查询进行一些排序。

id | status | created_at
------------------------
 1 | open   | 1348778070
 2 | closed | 1348711241
 3 | open   | 1348839204
 4 | closed | 1348738073
 5 | banned | 1348238422
Run Code Online (Sandbox Code Playgroud)

我如何对上表进行排序,以便按 ASC 顺序首先显示“打开”记录;然后非打开记录在 DESC 顺序中排第二?换句话说,是否有基于某种条件的动态二级排序方向?

我尝试了两个 SELECT 查询的 UNION 并在其中排序,这不起作用,因为 UNION 默认情况下会生成一组无序的行。

此外,我尝试了一个伪列,它从大量数字中减去 created_at 时间戳,对于关闭的状态记录,所以我可以按 ASC 订购以获得如下结果......

SELECT table.*, (table.created_at) as tmp_order FROM table
  WHERE table.status = 'open'
UNION
  SELECT table.*, (999999999 - table.created_at) as tmp_order FROM table
WHERE table.status = 'closed'
ORDER BY tmp_order ASC
Run Code Online (Sandbox Code Playgroud)

这有效,但我觉得必须有更好的方法。理想情况下,解决方案不会包含上述随机大数

pet*_*erm 5

更新

SELECT *
  FROM tmp_order
 ORDER BY FIELD(status, 'open') DESC, 
          CASE 
            WHEN status = 'open' 
              THEN created_at 
              ELSE (999999999 - created_at) 
          END 
Run Code Online (Sandbox Code Playgroud)

或者

SELECT *
  FROM tmp_order
 ORDER BY FIELD(status, 'open') DESC, 
          CASE 
            WHEN status = 'open' 
              THEN created_at END,
          CASE 
            WHEN status <> 'open' 
              THEN created_at END DESC
Run Code Online (Sandbox Code Playgroud)

输出:

| 身份证 | 状态 | CREATED_AT |
-----------------------------
| 1 | 打开 | 1348778070 |
| 3 | 打开 | 1348839204 |
| 4 | 关闭 | 1348738073 |
| 2 | 关闭 | 1348711241 |
| 5 | 禁止 | 1348238422 |

这是SQLFiddle演示。