我有一张表格,其中包含“时间”字样。它存储时间戳。我想订购它,以便如果时间戳在将来(即大于PHP的time()函数返回),它会按升序进行排序。如果它不是将来,请按顺序降序。
编辑: 假设我有这个时间戳列表(我知道它们不是真正的时间戳,但为了简单起见):
1896
779
468
1478
846
1384
然后假设当前时间戳为' 1000'。查询应该对列表进行重新排序,看起来像这样:
1384
1478
1896
846
779
468
因此,有效地将1000以上的所有数据分类为ASC,并且下面的所有数据都按DESC排序。
答案 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()
)