【问题标题】:How sort by new date first then by passed date?如何先按新日期排序,然后按过去日期排序?
【发布时间】:2015-10-24 13:45:31
【问题描述】:

我在 mysql 数据库中有日期列。我需要按日期对 ASC 进行排序,但首先显示尚未发生的日期,然后显示女巫发生的日期。那条sql语句怎么做?结果示例:

for date 25 October 2015
new by ASC:
2015-10-25
2015-10-27
2015-11-03
...
then old by DESC:
2015-10-24
2015-10-14
2015-09-10
...

ps 我正在使用 Yii2 框架(但干净的 php 也可以)。

【问题讨论】:

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


    【解决方案1】:

    鉴于此示例数据:

    CREATE TABLE t
        (`date` date)
    ;
    
    INSERT INTO t
        (`date`)
    VALUES
        ('2015-10-25'),
        ('2015-10-27'),
        ('2015-11-03'),
        ('2015-10-24'),
        ('2015-10-14'),
        ('2015-09-10')
    ;
    

    这个查询:

    SELECT
    date
    FROM
    t
    ORDER BY
    date >= CURDATE() DESC
    , ABS(DATEDIFF(date, CURDATE()));
    

    你得到你想要的输出:

    |                        date |
    |-----------------------------|
    |   October, 25 2015 00:00:00 |
    |   October, 27 2015 00:00:00 |
    |  November, 03 2015 00:00:00 |
    |   October, 24 2015 00:00:00 |
    |   October, 14 2015 00:00:00 |
    | September, 10 2015 00:00:00 |
    
    • sqlfiddle 中实时查看它的工作情况

    【讨论】:

    • 为此目的巧妙地使用了abs(datediff())。请注意,这适用于日期,但如果有时间组件,逻辑会有点棘手。
    • 您好@GordonLinoff 我的回答是基于您之前的回答stackoverflow.com/questions/33282377/… 让我知道是否有一种紧凑的方法可以做到这一点
    【解决方案2】:

    检查完fancyPants解决方案后我傻了。

    但我想展示我正在使用的那个

    SqlFiddleDemo

      SELECT *
      FROM (
            SELECT t.*,
                   (@rn := if(true, @rn + 1, 1)
                   ) as rn
            FROM myTable t         
            CROSS JOIN
                  (select @rn := 0) params
            WHERE dateField >= NOW()
            ORDER BY dateField asc
          ) X
      UNION 
      SELECT *
      FROM (
            SELECT t.*,
                     (@bn := if(true, @bn + 1, 1)
                     ) as rn
            FROM myTable t         
            CROSS JOIN
                  (select @bn := (SELECT COUNT(*) 
                                  FROM myTable 
                                  WHERE dateField >= NOW()
                                 ) a
                  ) params
            WHERE dateField < NOW()
            ORDER BY dateField desc
          ) Y 
    

    输出

    |                   dateField | rn |
    |-----------------------------|----|
    |   October, 25 2015 00:00:00 |  1 |
    |   October, 27 2015 00:00:00 |  2 |
    |  November, 03 2015 00:00:00 |  3 |
    |   October, 24 2015 00:00:00 |  4 |
    |   October, 14 2015 00:00:00 |  5 |
    | September, 10 2015 00:00:00 |  6 |
    

    【讨论】:

    • 我不认为这是 OP 想要的,但这是一个有趣的解释。
    猜你喜欢
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2023-03-14
    相关资源
    最近更新 更多