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
,你得到了想要的顺序。
这会避免重复谓词,但可能会影响性能。
我有一个 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
,你得到了想要的顺序。
这会避免重复谓词,但可能会影响性能。