【问题标题】:mySQL complex SELECT with ORDER BY带有 ORDER BY 的 mySQL 复杂 SELECT
【发布时间】:2021-11-16 17:15:05
【问题描述】:

一个 mysql 表有两个日期(时间戳)列。

仅应选择日期大于当前时间戳的那些行,按最接近的日期排序(从当前时间戳开始计算)。

“date_1”列始终包含一个日期值。

"date_2" 总是包含较晚(较高)的日期值,但有时 "date_2" 未设置日期值(在这种情况下,"date_2" 的时间戳为空或为零,例如以下行名称“D”):

例子:

name date_1 date_2
A 2021-03-29 2022-03-29 (1 year later)
B 2021-11-15 2021-12-07
C 2021-11-24 2021-12-28
D 2021-11-25 (empty)

以下 mysql 代码无法正常工作(2021 年 11 月 16 日执行):

SELECT * FROM table WHERE date_1 > time() OR date_2 > time() ORDER BY date_1, date_2

(错误的)结果顺序是:

name date_1 date_2
A (2021-03-29, expired) 2022-03-29
B (2021-11-15, expired) 2021-12-07
C 2021-11-23 2021-12-28
D 2021-11-25 (empty)

更改顺序(ORDER BY date_2, date_1)...

SELECT * FROM table WHERE date_1 > time() OR date_2 > time() ORDER BY date_2, date_1

...结果如下(也是错误的):

name date_1 date_2
D 2021-11-25 (empty)
B (2021-11-15, expired) 2021-12-07
C 2021-11-23 2021-12-28
A (2021-03-29, expired) 2022-03-29

在 2021-11-16 上执行的正确 mySQL SELECT 顺序应该是(重要日期以粗体显示):

name date_1 date_2
C 2021-11-23 2021-12-28
D 2021-11-25 (empty)
B (2021-11-15, expired) 2021-12-07
A (2021-03-29, expired) 2022-03-29

例如在 2021-11-24 上执行的正确 mySQL SELECT 顺序应该是:

name date_1 date_2
D 2021-11-25 (empty)
B (2021-11-15 expired) 2021-12-07
C (2021-11-23, expired) 2021-12-28
A (2021-03-29 expired) 2022-03-29

例如在 2021-12-08 上执行的正确 mySQL SELECT 顺序应该是:

name date_1 date_2
C (2021-11-23, expired) 2021-12-28
A (2021-03-29 expired) 2022-03-29

正确的 SELECT 语句应该是什么样子的?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以通过使用IF 语句选择一个新列然后ORDER BY 该新列来简单地做到这一点。像这样

    SELECT *, IF(date_1 > DATE(NOW()), date_1, date_2) as NewDate 
    FROM table 
    WHERE date_1 > DATE(NOW()) OR date_2 > DATE(NOW()) 
    ORDER BY NewDate
    

    Check this fiddle out

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      相关资源
      最近更新 更多