所以我找不到这个问题的答案,我有以下查询:
SELECT *
FROM bans
WHERE
removed = 0
AND
(
(`time` + `length` - UNIX_TIMESTAMP()) > 0
OR
length = 0
)
ORDER BY length = 0,(`time` + `length` - UNIX_TIMESTAMP())
它从一张表中获取所有禁令,并根据何时解除禁令对其进行排序。但是长度为 0 的禁令是永久禁止的,它们应该位于列表的底部。这已经奏效了。但我希望那些永久禁令由banid降序排列。目前它们不是默认的升序排列。
如果我将 asc 放入其中,则孔顺序被拧紧
数据库:
CREATE TABLE IF NOT EXISTS `rp_bans` (
`banid` int(11) NOT NULL AUTO_INCREMENT,
`steamid` text NOT NULL,
`name` text NOT NULL,
`adminid` text NOT NULL,
`aname` text NOT NULL,
`reason` text NOT NULL,
`time` int(11) NOT NULL,
`length` int(11) NOT NULL,
`removed` tinyint(1) NOT NULL,
PRIMARY KEY (`banid`)
)
示例数据:
id time length current time timeleft
1 1365410228 0 1365411228 -1000
2 1365410229 3600 1365411228 2601
3 1365410230 0 1365411228 -998
4 1365410231 84000 1365411228 83003
5 1365410232 3600 1365411228 2604
6 1365410233 0 1365411228 -995
7 1365410234 800000 1365411228 799006
预期结果:
id time length current time timeleft
2 1365410229 3600 1365411228 2601
5 1365410232 3600 1365411228 2604
4 1365410231 84000 1365411228 83003
7 1365410234 800000 1365411228 799006
6 1365410233 0 1365411228 -995
3 1365410230 0 1365411228 -998
1 1365410228 0 1365411228 -1000
因此,如果长度不为 0,则按 timeleft 升序排列(根据时间 + 长度 - 当前时间计算)。当长度为 0 时,它需要按 id 降序排列在长度不为 0 的条目后面。