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 中的条件返回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;
【讨论】:
【参考方案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 表达式?的主要内容,如果未能解决你的问题,请参考以下文章
Python学习之旅—Mysql数据库之表操作(where+group by+having+order by)
ORACLE数据库--order by----ORA-01785 ORDER BY必须是select-list 表达式的数目