答案 0 :(得分:1)
使用演员表和字段
select * from my_table
order by cast(`year` as signed ) desc,
FIELD('', `month`, 'January', 'Febrary', 'March', 'April', 'May', 'June', 'July', 'August', 'September' , 'November', 'December') desc,
cast(date as signed) desc, id desc;
答案 1 :(得分:0)
我了解您要更正数据模型并将三列更改为一个日期列,但您不能。
因此,使用生成的列扩展表格,而不是保留日期值:
alter table mytable add mydate date generated always as
(str_to_date(concat("date", ' ', "month", ' ', "year"), '%d %M %Y')) stored;
从那一刻起,您将始终拥有要使用的日期列。它将根据现有列自动填充。 (您也可以将此生成的列virtual
而不是stored
,但读访问速度会更慢。)
然后使用此列来排序结果行。由于MySQL的ORDER BY
不支持任何NULLS FIRST / NULLS LAST
子句,因此需要CASE WHEN
表达式来获取空值。
select *
from mytable
order by case when mydate is null then 1 else 2 end, mydate desc, id desc;
以下是有关生成列的文档:https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html。
答案 2 :(得分:-1)
首先,您应将月份值存储为数字,然后在查询结尾处使用order by。
Order by col1, col2, col3
然后根据您的需要ASC
或DESC
更好的方法是使用一列作为DATE
类型,然后你可以这样做:
Order by YEAR(col_name), MONTH(col_name), DAY(col_name)