Я понимаю что вы хотите исправить данные и изменить три столбца на один столбец даты, но вы не можете.
Так расширить таблицу с генерируемым столбцом, содержащего значение даты, вместо:
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.
[Используйте ORDER BY для сортировки по нескольким столбцам] (http://dev.mysql.com/doc/refman/5.7/ru/sorting-rows.html). Я настоятельно рекомендую вам рассмотреть возможность изменения таблицы для использования столбца datetime вместо трехуровневой настройки, которую вы используете atm. Использование столбца datetime сделает запрос по датам намного проще. – JimL
Каков тип данных столбцов Месяц, Год и дата? и на основе вашего образца, каков ожидаемый результат? – scaisEdge
* Если две строки имеют одинаковую дату, тогда вторая строка придет первой. * Непонятно, что это значит, потому что в mysql нет предыдущей и следующей строки, и кроме того у вас нет уникального столбца для его заказа – splash58