MySQL порядок на 2 столбца даты в зависимости от того, что больше

0

Сегодня я столкнулся с проблемой отладки кода: учитывая следующий фрагмент данных 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                ║
╚════╩═════════════════════╩═════════════════════╝

Мне нужно отсортировать эти даты соответственно:

  1. Если date_updated имеет значение null используйте ее date_created
  2. Если date_updated > date_created используйте ее date_updated (хотя это всегда должно быть так)
  3. Если сравниваются две записи A, B, где A имеет только 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 здесь?

  • 0
    Вы просто путаете даты. Когда вы обнаружите, что есть date_updated вы хотите использовать, вы по ошибке используете вместо него date_created .
  • 0
    Упрощенным решением было бы сохранить значение date_created как начальное значение date_updated для всех записей (вместо того, чтобы сохранять его нулевым).
Теги:

2 ответа

0
Лучший ответ

date_updated имеет приоритет над date_created. Используйте COALESCE для этого:

SELECT * 
FROM mytable
ORDER BY COALESCE(date_updated, date_created) DESC;
1

Неверная логика вашего заявления о вашем случае. По ошибке вы заменили 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню