2017-01-31 3 views
0

Я храню данные в своей базе данных. Данные хранятся выглядит как этотСортировка по месяцам

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. Поэтому в идеале выше должны быть январь, а затем февраль.

Можно ли заказать заказ через upload_month?

Благодаря

ответ

3

Предполагая, что вы заботитесь о том, чтобы получать месяцы в хронологическом порядке без учета года, вы можете отформатировать месяц как дату, а затем отсортировать его.

Например:

order by str_to_date(concat(year(current_date()),'-', upload_month,'-01'),'%Y-%M-%d') 
1
ORDER BY CASE months.upload_month 
    WHEN 'January' THEN 1 
    WHEN 'February' THEN 2 
    -- ... You get the idea 
    WHEN 'December' THEN 12 
END 

И в следующий раз, когда вы можете хранить месяц, как TINYINT, чтобы избежать этой проблемы.

+0

MySQL знает о названиях месяцев – Strawberry

+1

@Strawberry По крайней мере, * английские * имена. Поэтому я рекомендую опубликовать другие решения. –

2

вы можете преобразовать название месяца в число и использовать его в качестве порядка, как это.

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

По какой-то причине% b не работал, пришлось изменить его на% M –

+0

'% b \t Сокращенное название месяца (Jan..Dec)' –

Смежные вопросы