MySQL 如果满足条件,则按不同字段排序

MySQL Order By different field if condition is met

我有一个 table 事件,其中一些是音乐会,其中填充了时间戳列。有些是测验,因为它们是重复发生的事件,所以它们没有设置时间戳,但我将另外两列称为日期和时间。

我需要一个 select 来在 TIME(timestamp) asc 之后对这个 table 进行排序,除非是 event_type = 'quiz' 列,那么它应该按 time 列排序相反。

只需要考虑 "hour:minute" 部分,而不是日期。

我该怎么做?请参阅下面的示例 table:

title      event_type timestamp           day       time
concert_1  music      2015-02-09 18:00:00
quiz_1     quiz       0000-00-00 00:00:00 Monday    16:30
concert_2  music      2015-02-10 19:00:00
quiz_2     quiz       0000-00-00 00:00:00 Tuesday   14:00

结果应该是:

title      event_type timestamp           day       time
quiz_2     quiz       0000-00-00 00:00:00 Tuesday   14:00
quiz_1     quiz       0000-00-00 00:00:00 Monday    16:30
concert_1  music      2015-02-09 18:00:00
concert_2  music      2015-02-10 19:00:00

使用条件表达式 return 两者之一。

例如:

 ORDER BY IF(t.event_type='quiz',t.time,TIME(t.timestamp))

MySQL IF() 函数将第一个参数计算为布尔值;如果结果为 TRUE,则 return 是第二个参数,否则 return 是第三个参数。

符合 ANSI 标准的等效项是

ORDER BY CASE WHEN t.event_type = 'quiz' THEN t.time ELSE TIME(t.timestamp) END

这假定 time 列声明为 TIME 数据类型,timestamp 列声明为 DATETIMETIMESTAMP 数据类型。如果不是这种情况,那么我们希望 return 表达式 return 具有相同数据类型的规范格式,以便它们可以正确排序。