【问题标题】:MySQL order by first column, sorted by second columnMySQL 按第一列排序,按第二列排序
【发布时间】:2016-07-19 15:18:02
【问题描述】:

我正在尝试为我的 MySQL 查询获取正确的 ORDER BY,但是我无法正确获取订单。

我有两列:

  1. breaking_news = 值为 NULL1
  2. news_published_dt = 值为DATETIME

如何排序,使第一个输出是breaking_news NOT NULLDATETIME 排序,然后其余的只是按DATETIME 排序?

我试过了,但是没有输出

ORDER BY CASE WHEN n.breaking_news IS NOT NULL THEN 1 ELSE 2 END, n.news_published_dt DESC

【问题讨论】:

  • SELECT * FROM tableName ORDER BY broken_news DESC, news_published_dt ASC (UPDATED)
  • @MalikAsif 工作,谢谢! :) 请发表答案

标签: mysql sql sorting datetime sql-order-by


【解决方案1】:

看起来,您正在寻找这个:

SELECT 
    * 
FROM 
    tableName 
ORDER BY 
    breaking_news DESC, 
    news_published_dt ASC

【讨论】:

    【解决方案2】:
    SELECT * FROM table_name ORDER BY news_published_dt DESC
    

    【讨论】:

      【解决方案3】:
      select * from 
      (select *, 1 Shortby from table 1 where (breaking_news is null)
      union all
      select *, 2 Shortby from table 1 where (breaking_news=1)
      ) a
      order by Shortby ,news_published_dt Desc
      

      【讨论】:

        【解决方案4】:

        MySQL 中的 SORT BY 的工作方式与您(包括我在内)的预期不同。您不能对两列进行排序,并让第一列中的每一列都按照第二列排序。

        不工作:

        ORDER BY breaking_news, news_published_dt
        

        结果:

        breaking_news | news_published_dt
                    1 | 2019-04-17
                    1 | 2019-04-04
                 null | 2019-05-01
                 null | 2019-05-06
        
        • 请注意,空值已正确排序,但 break_news 为 1;结果未根据发布者的要求进行排序。

        我发现完成此任务的唯一方法;单独查询想要的布尔结果,然后将两者合并在一起。

        这确实有效:

        (SELECT * FROM news_table WHERE breaking_news = 1 ORDER BY news_published_dt)
        UNION
        (SELECT * FROM news_table WHERE breaking_news <> 1 ORDER BY news_published_dt)
        

        结果:

        breaking_news | news_published_dt
                    1 | 2019-04-04
                    1 | 2019-04-17
                 null | 2019-05-01
                 null | 2019-05-06
        

        如需更详尽的解释,请查看Edwin Wang's explanation

        【讨论】:

          【解决方案5】:

          使用这个 当 n.break_news 不为 NULL 时按大小写排序 n.break_news ELSE 'zzzzzzzzzzzzzzzzzzzzzz' END, n.news_published_dt DESC

          【讨论】:

            猜你喜欢
            • 2016-11-07
            • 1970-01-01
            • 2022-01-04
            • 2018-10-07
            • 2012-02-28
            • 2021-05-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多