MySQL : ORDER BY 表达式?

MySQL : ORDER BY expression?

在一个网站上,我有一个项目列表,我很难用 MySQL 对其进行排序。

有些项目是 "expired"(他们的 end_at 是过去的),我想找回它们,但是在 "active" 项目之后(他们的 end_at 可以是 NULL 或将来的)。

我希望能够根据另一个字段对项目进行进一步排序,比方说 "views"(首先获得最受欢迎的)

基本上,这就是我想要得到的:

到目前为止,这是我尝试过的:

SELECT name, end_at 
FROM items 
ORDER BY (end_at IS NULL OR end_at > CURDATE()), views DESC;  

不起作用:即使是第一个退回的商品也已过期。

我刚刚找到了一个方法:

SELECT *
FROM items 
ORDER BY CASE
WHEN (end_at IS NULL OR end_at > CURDATE()) 
    THEN 0 
    ELSE 1 
END, views DESC;

根据表达式,CASE WHEN 影响每一行的值。排序像往常一样,使用这个计算值。

你快明白了。 MySQL returns 01 中的条件。由于 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;