MySQL 多向 ORDER BY

MySQL multidirectional ORDER BY

我有一个 table,其列 'time' 用于存储时间戳。我想对其进行排序,以便如果时间戳在未来(即大于 PHP 的 time() 函数 returns),它会对其进行升序排序。如果不是在未来,按降序排列。

编辑: 假设我有这个时间戳列表(我知道它们不是实际的,但为了简单起见):

1896
779
468
1478
846
1384

那么假设当前时间戳是'1000'。该列表应按查询重新排序,如下所示:

1384
1478
1896
846
779
468

实际上,所有 1000 以上的数据都按 ASC 排序,而所有低于 1000 的数据都按降序排序。

我认为您不能以两种不同的方式按相同的列对相同的查询进行排序,但是分两步执行此操作可能会获得相同的结果。您可以 运行 两个单独的查询并合并结果,或者另一个选项是使用 UNION

假设您现在拥有:

SELECT * FROM `table` ORDER BY `timestamp`

你可以改写为:

(
    SELECT 
        * 
    FROM 
        `table` 
    ORDER BY 
        `timestamp` DESC 
    WHERE 
        timestamp < NOW()
) 
UNION ALL 
(
    SELECT 
        * 
    FROM 
        `table` 
    ORDER BY 
        `timestamp` ASC 
    WHERE timestamp >= NOW()
)

您可以在 ORDER BY 中输入一个表达式:

 ORDER BY ts >= NOW() DESC, (ts >= NOW()) * ts ASC, ts DESC 

布尔条件在 MySQL 中返回为 0 或 1。

因此所有未来的时间戳都是有序的1 DESC, timestamp ASC, [timestamp DESC],过去的时间戳也是有序的0 DESC, 0 ASC, timestamp DESC,你得到了想要的顺序。

这会避免重复谓词,但可能会影响性能。