【问题标题】:MySQL : ORDER BY expression?MySQL:ORDER BY 表达式?
【发布时间】: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;  

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

【问题讨论】:

    标签: mysql sql-order-by


    【解决方案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 根据表达式影响每一行的值。使用这个计算值,像往常一样进行排序。

      【讨论】:

        猜你喜欢
        • 2010-12-21
        • 2017-10-13
        • 1970-01-01
        • 2014-06-17
        • 1970-01-01
        • 2013-10-17
        • 2017-09-21
        • 2014-05-10
        • 2011-08-14
        相关资源
        最近更新 更多