在网站上,我有一个我正在努力与MySQL排序的项目列表。
有些项目是“过期”(它们的end_at是过去的),我想要检索它们,但是在“活动”项之后(它们的end_at可以是NULL或将来)。 / p>
我希望能够根据另一个字段进一步对项目进行排序,让我们说“观点”(首先获得最受欢迎的项目)
基本上,这是我想要的:
到目前为止,这是我尝试过的:
SELECT name, end_at
FROM items
ORDER BY (end_at IS NULL OR end_at > CURDATE()), views DESC;
不起作用:即使第一个退回的项目已过期。
答案 0 :(得分:1)
你几乎得到了它。 MySQL中的条件返回0
或1
。由于0
出现在1
之前,您必须对desc
SELECT name,end_at FROM items
ORDER BY (end_at IS NULL OR end_at > CURDATE()) DESC,
views DESC;
或否定条件以获得所需结果
SELECT name,end_at FROM items
ORDER BY end_at IS NOT NULL AND end_at < CURDATE() ASC,
views DESC;
答案 1 :(得分:0)
我刚刚找到了一条路:
SELECT *
FROM items
ORDER BY CASE
WHEN (end_at IS NULL OR end_at > CURDATE())
THEN 0
ELSE 1
END, views DESC;
CASE WHEN根据表达式影响每一行的值。使用此计算值,照常完成排序。