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)
知道如何解决这个问题吗?
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)
正如 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)