MySQL:ORDER BY 表达式?

Posted

技术标签:

【中文标题】MySQL:ORDER BY 表达式?【英文标题】:MySQL : ORDER BY expression? 【发布时间】:2016-05-22 12:53:15 【问题描述】:

在一个网站上,我有一个我正在努力使用 mysql 排序的项目列表。

有些项目“过期”(它们的 end_at 是过去的),我想找回它们,但在“活动”项目之后(它们的 end_at 可以是 NULL 或将来)。

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

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

项目 1(活跃 - 最受欢迎) 项目 2(活跃 - 第二受欢迎) 项目 3(活跃 - 第三受欢迎) 第 4 项(已过期) 第 5 项(已过期) (等等)

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

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

不起作用:即使是第一个返回的项目也已过期。

【问题讨论】:

【参考方案1】:

你几乎明白了。 MySQL 中的条件返回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;

【讨论】:

【参考方案2】:

我刚刚找到了一种方法:

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:ORDER BY 表达式?的主要内容,如果未能解决你的问题,请参考以下文章

mysql order by 自定义

Python学习之旅—Mysql数据库之表操作(where+group by+having+order by)

在数据库查询中order by 后面可以给表达式吗?

ACCESS 的 ORDER BY 问题

ORACLE数据库--order by----ORA-01785 ORDER BY必须是select-list 表达式的数目

ORDER BY 子句的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列