Сегодня я столкнулся с проблемой отладки кода: учитывая следующий фрагмент данных MySQL:
╔════╦═════════════════════╦═════════════════════╗
║ id ║ date_created ║ date_updated ║
╠════╬═════════════════════╬═════════════════════╣
║ 1 ║ 2015-12-07 15:04:21 ║ 2016-06-06 10:59:25 ║
╠════╬═════════════════════╬═════════════════════╣
║ 2 ║ 2016-06-06 10:59:25 ║ 2016-09-09 09:44:58 ║
╠════╬═════════════════════╬═════════════════════╣
║ 3 ║ 2016-09-09 09:44:59 ║ 2017-11-30 11:36:37 ║
╠════╬═════════════════════╬═════════════════════╣
║ 4 ║ 2017-11-30 11:36:37 ║ null ║
╚════╩═════════════════════╩═════════════════════╝
Мне нужно отсортировать эти даты соответственно:
date_updated
имеет значение null
используйте ее date_created
date_updated > date_created
используйте ее date_updated
(хотя это всегда должно быть так)date_created
и B date_updated
не является нулевым, и эти два значения равны, тогда A должно быть заказано больше B.Поэтому ожидаемый результат должен быть следующим:
╔════╦═════════════════════╦═════════════════════╗
║ id ║ date_created ║ date_updated ║
╠════╬═════════════════════╬═════════════════════╣
║ 4 ║ 2017-11-30 11:36:37 ║ null ║
╠════╬═════════════════════╬═════════════════════╣
║ 3 ║ 2016-09-09 09:44:59 ║ 2017-11-30 11:36:37 ║
╠════╬═════════════════════╬═════════════════════╣
║ 2 ║ 2016-06-06 10:59:25 ║ 2016-09-09 09:44:58 ║
╠════╬═════════════════════╬═════════════════════╣
║ 1 ║ 2015-12-07 15:04:21 ║ 2016-06-06 10:59:25 ║
╚════╩═════════════════════╩═════════════════════╝
Я пробовал следующий запрос:
SELECT * FROM table t
ORDER BY
CASE
WHEN t.date_updated IS NOT NULL AND t.date_updated > t.dated_created
THEN t.date_created
ELSE t.date_updated
END
DESC
Однако это не упорядочивает правильно в соответствии с пунктом 2. Какое будет правильное выражение MySQL здесь?
date_updated
имеет приоритет над date_created
. Используйте COALESCE
для этого:
SELECT *
FROM mytable
ORDER BY COALESCE(date_updated, date_created) DESC;
Неверная логика вашего заявления о вашем случае. По ошибке вы заменили t.date_updated и t.date_created (проверьте строку 5 и 6 ниже SQL-запроса)
Попробуй это
SELECT * FROM table t
ORDER BY
CASE
WHEN t.date_updated IS NOT NULL AND t.date_updated > t.dated_created
THEN t.date_updated
ELSE t.date_created
END
DESC
date_updated
вы хотите использовать, вы по ошибке используете вместо негоdate_created
.