2016-05-29 2 views
0

Я хочу получить заказ строк таблицы по дате (год, месяц и дата)MySql заказ по запросу по годам и месяцам имя

table

  • если дата является пустым, он должен прийти первый
  • если дата присутствует, то она должна соответствовать дате в порядке убывания.
  • если две строки имеют такую ​​же дату, а затем вторую строку.

Как сделать это делается с помощью MySQL Query

+3

[Используйте ORDER BY для сортировки по нескольким столбцам] (http://dev.mysql.com/doc/refman/5.7/ru/sorting-rows.html). Я настоятельно рекомендую вам рассмотреть возможность изменения таблицы для использования столбца datetime вместо трехуровневой настройки, которую вы используете atm. Использование столбца datetime сделает запрос по датам намного проще. – JimL

+0

Каков тип данных столбцов Месяц, Год и дата? и на основе вашего образца, каков ожидаемый результат? – scaisEdge

+0

* Если две строки имеют одинаковую дату, тогда вторая строка придет первой. * Непонятно, что это значит, потому что в mysql нет предыдущей и следующей строки, и кроме того у вас нет уникального столбца для его заказа – splash58

ответ

-1

Во-первых, вы должны хранить значения в месяц, как числа, то используйте заказ в конце вашего запроса.

Order by col1, col2, col3 

Тогда либо ASC ИЛИ DESC в зависимости от того, что вам нужно

Еще лучше было бы использовать один столбец как DATE типа, то вы могли бы сделать:

Order by YEAR(col_name), MONTH(col_name), DAY(col_name) 
+0

Число месяцев месяца и даты являются строками, поэтому числовое значение поля будет сортироваться, а поле месяца будет отсортировано в алфавитном порядке – PlanetHackers

+0

А, да, хорошая точка! :) Я уточню свой ответ для лучшего подхода – charlie

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; 
+0

Была ли ваша мера другим условием, указанным в вопросе – PlanetHackers

+0

Я добавил идентификатор в порядке для варианта второй строки. Я надеюсь, что ничего не забывается. – scaisEdge

+0

Хорошо, я проверил его завтра , Теперь я пойду спать. Спасибо – PlanetHackers

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.

+0

Вы можете заменить 'case, когда mydate равно null, затем 1 else 2 end' by 'mydate is null desc' или' mydate is not null' – ebahi

+0

@ebahi: Да, вы правы. Иногда я забываю про MySQL 'true = 1' /' false = 0'. Спасибо, что указали это , –

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