如何在 MySQL 中使用条件 ORDER BY?

zwi*_*ion 5 mysql order-by condition

我有表格课程,其中有一些字段,还有字段course(string)favorited(bool)favoritedDate(dateTime)、 dateUpload。

教师上传课程,此日期存储在dateUpload字段中。如果教师将此课程标记为最喜欢的,则该信息在字段中为数字 1,favorited标记日期存储在字段中favoritedDate

现在我需要从特定老师那里检索所有课程,然后按日期对列表进行排序:如果课程被标记为favorited=1应由 订购favoritedDate,dateUpload desc,如果favorited=0仅应由 订购 dateUpload desc

这是我到目前为止所拥有的,但它不起作用:

SELECT * from courses where teacherId = 23 
ORDER BY 
  CASE favorited WHEN 1 THEN favoritedDate, dateUpload
    else dateUpload
  END
  DESC
;
Run Code Online (Sandbox Code Playgroud)

知道如何解决这个问题吗?

Len*_*art 5

case 表达式返回一个原子值,所以你不能返回:

favoritedDate, dateUpload
Run Code Online (Sandbox Code Playgroud)

我认为这会做你想做的:

ORDER BY
    CASE favorited WHEN 1 THEN favoritedDate 
                          ELSE dateUpload 
    END DESC, dateUpload
Run Code Online (Sandbox Code Playgroud)


ype*_*eᵀᴹ 5

正如 Lennart 解释的那样,CASEMySQL 中的表达式只能生成一个值,而不是两个或多个。我认为这将适合您的问题:

ORDER BY
    CASE WHEN favorited = 1 THEN 0 ELSE 1 END,
    CASE WHEN favorited = 1 THEN favoritedDate END,
    dateUpload DESC ;
Run Code Online (Sandbox Code Playgroud)

如果favoritedDate值是NULL该项目不被“收藏”时的值,那么您真的根本不需要该favorited列。信息存储在favoritedDate:如果它为空,则它不是最喜欢的。如果它不为空,则为空。在ORDER BY这种情况下(不是简单多了,因为MySQL的分选前不为空值空值):

ORDER BY
    (favoritedDate IS NULL),
    favoritedDate,
    dateUpload DESC ;
Run Code Online (Sandbox Code Playgroud)