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)
这有效,但我觉得必须有更好的方法。理想情况下,解决方案不会包含上述随机大数
更新
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演示。
| 归档时间: |
|
| 查看次数: |
2147 次 |
| 最近记录: |