MySQL:ORDER BY表达式?

时间:2016-05-22 12:53:16

标签: mysql sql-order-by

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

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

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

基本上,这是我想要的:

  • 第1项(活跃 - 最受欢迎)
  • 第2项(有效 - 第2最受欢迎)
  • 第3项(活跃 - 第3位最受欢迎)
  • 第4项(已过期)
  • 第5项(已过期)
  • (依此类推)

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

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

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

2 个答案:

答案 0 :(得分: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;

答案 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根据表达式影响每一行的值。使用此计算值,照常完成排序。