【问题标题】:Custom sorting in MYSQLMYSQL中的自定义排序
【发布时间】:2016-04-25 13:35:36
【问题描述】:

我正在尝试从按特定排序的 MySQL 表中选择数据。 为简单起见,我们假设有 3 列:

ID    Priority    ValidDate
1     5           2016-12-12
2     5           2016-03-11
3     0           null
4     0           null
5     0           2016-08-01
6     6           2016-12-31

我想要的是将输出排序如下:

  • 如果 ValidDate > curdate(),按 ValidDate desc 显示第一顺序(不考虑优先级)

  • 如果 ValidDate 为 null 或 ValidDate

所以对于上表,输出应该是这样的:

ID    Priority    ValidDate
6     6           2016-12-31
1     5           2016-12-12
5     0           2016-08-01
3     0           null
4     0           null
2     5           2016-12-31

我试过这个查询:

SELECT id, image, campaignid, priority, sponsored FROM au_hpbanner order by (sponsored > curdate()) desc, (case when sponsored < curdate() then priority end) asc;

但它不起作用,因为行 ID 2 仍然在 ID 5 之后,尽管它应该在底部。 感谢您的帮助!

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    一种可能性是使用UNION SELECTs,这样可以更好地控制您的每个案例:

    SELECT *
    FROM 
        (SELECT id,
             image,
             campaignid,
             priority,
             sponsored
        FROM au_hpbanner
        WHERE ValidDate > curdate()
        ORDER BY  ValidDate DESC) a
    UNION
    SELECT *
    FROM 
        (SELECT id,
             image,
             campaignid,
             priority,
             sponsored
        FROM au_hpbanner
        WHERE ValidDate < curdate()
        ORDER BY  priority ASC) b
    

    【讨论】:

      【解决方案2】:

      事实证明这两种方法都有效(我的方法和 C4ud3x 建议的 Union Select 方法)。但是,两者都没有正确考虑空值,这就是我的查询一开始就不起作用的原因。

      我的解决方案的正确版本:

      SELECT id, image, campaignid, priority, sponsored 
      FROM au_hpbanner 
      ORDER BY (sponsored > curdate() and sponsored is not null) desc,
               (case when sponsored < curdate() or sponsored is null then priority end) asc;
      

      C4ud3x 解决方案的略微改进版本:

      SELECT *
      FROM 
          (SELECT id, image, campaignid, priority, sponsored
          FROM au_hpbanner
          WHERE sponsored > curdate()
          ORDER BY sponsored desc) a
      UNION
      SELECT *
      FROM 
          (SELECT id, image, campaignid, priority, sponsored
          FROM au_hpbanner
          WHERE sponsored < curdate() or sponsored is null
          ORDER BY priority asc) b
      

      我不确定这些工作中哪一个在性能方面效果更好。但是,如果 Union Selects 需要更多的数据库往返,那么第一个解决方案会更好,这对我来说很重要,因为我正在处理一个巨大的数据库。

      【讨论】:

        猜你喜欢
        • 2013-04-09
        • 1970-01-01
        • 2011-01-11
        • 1970-01-01
        • 2014-03-04
        • 1970-01-01
        • 2011-05-17
        • 2013-05-05
        • 1970-01-01
        相关资源
        最近更新 更多