MySQL多向ORDER BY

时间:2015-09-29 15:31:11

标签: php mysql time timestamp

我有一张表格,其中包含“时间”字样。它存储时间戳。我想订购它,以便如果时间戳在将来(即大于PHP的time()函数返回),它会按升序进行排序。如果它不是将来,请按顺序降序。

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

1896
779
468
1478
846
1384

然后假设当前时间戳为' 1000'。查询应该对列表进行重新排序,看起来像这样:

1384
1478
1896
846
779
468

因此,有效地将1000以上的所有数据分类为ASC,并且下面的所有数据都按DESC排序。

2 个答案:

答案 0 :(得分:3)

您可以在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,您就可以获得所需的订单。

这可以节省您重复的谓词,但可能会妨碍性能。

答案 1 :(得分:2)

我认为您不能以两种不同的方式按相同的列对相同的查询进行排序,但可以通过两步完成相同的结果。您可以运行两个单独的查询并合并结果,或者另一个选项是使用 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()
)