订购一个月的名称

时间:2017-01-31 17:14:26

标签: mysql

我正在将数据存储在我的数据库中。存储的数据如下所示

id  | upload_month | created_at
-----------------------------------------
1   | Febuary      | 2017-01-30 13:22:39
-----------------------------------------
2   | January      | 2017-01-30 13:23:42
-----------------------------------------
3   | January      | 2017-01-30 13:25:33

我需要做的是获取唯一的upload_months,始终使用最新的created_at日期。所以对于上面的事情我是在追求这样的事情

id  | upload_month | created_at
-----------------------------------------
1   | Febuary      | 2017-01-30 13:22:39
-----------------------------------------
2   | January      | 2017-01-30 13:25:33
-----------------------------------------

为实现这一点,我有以下SQL

SELECT *
  FROM uploaded_file
  JOIN (SELECT uploaded_file.upload_month, MAX(uploaded_file.created_at) created_at
          FROM uploaded_file
      GROUP BY uploaded_file.upload_month) months
    ON uploaded_file.upload_month = months.upload_month
   AND uploaded_file.created_at = months.created_at

现在上面的效果很好,但现在我想通过upload_month来订购上面的结果。理想情况下,上面应该是1月1日,然后是2月。

我可以通过upload_month订购任何方式吗?

由于

3 个答案:

答案 0 :(得分:3)

假设您所关心的是按照时间顺序获取月份而不考虑年份,那么您可以将月份格式化为日期,然后按此排序。

例如:

order by str_to_date(concat(year(current_date()),'-', upload_month,'-01'),'%Y-%M-%d')

答案 1 :(得分:2)

ORDER BY CASE months.upload_month
    WHEN 'January' THEN 1
    WHEN 'February' THEN 2
    -- ... You get the idea
    WHEN 'December' THEN 12
END

下次您可以将月份存储为TINYINT以避免此问题。

答案 2 :(得分:2)

您可以将月份名称转换为数字,并按此顺序使用它。

order by month(str_to_date(upload_month,'%M'))