我正在尝试按rep
排序,但如果post.date
超过一天,则必须按正常顺序排序(表示id
字段顺序)。
这里是posts
表(日期是unix时间戳);
id | date | rep | title ------------------------------ 10 | today | 0 | lorem 9 | today | 1 | ipsum 8 | yesterday | 2 | dolor 7 | 2 days ago | 2 | sit 6 | 3 days ago | 10 | amet
预期的结果(试图得到这样的结果是不可能或无意义的,或者我感到困惑);
id | title ---------- 9 | ipsum 10 | lorem 8 | dolor 7 | sit 6 | amet
这是我测试的,首先返回太旧的帖子;
ORDER BY CASE WHEN p.date + unix_timestamp(from_unixtime(p.date) + interval 1 day) > unix_timestamp(now()) THEN p.rep ELSE p.id END DESC // or ... END DESC, p.id DESC
答案 0 :(得分:1)
尝试:
ORDER BY
CASE WHEN
p.date >= unix_timestamp(now() - interval 1 day)
-- this part edited to worked vers
-- THEN -p.rep ELSE NULL
THEN +p.rep ELSE NULL
END
DESC, p.id DESC;
如果我理解正确的话,应该由代表订购最近1天以上的东西。 -p.rep和DESC应该在第一层排序中将NULL放在最后。对于日期早于一天的所有行,第一层排序将为NULL并显示在最后,您可以随后按照您希望的顺序按p.id排序。
答案 1 :(得分:0)
然后做两个不同的查询呢?UNION呢?
(SELECT *
FROM POST
WHERE [YOUR CONDITION ON DATES > YESTERDAY]
ORDER BY rep DESC, id DESC)
UNION
(SELECT *
FROM POST
WHERE [YOUR CONDITION ON DATES < YESTERDAY]
ORDER BY id DESC);