Элементы заказа Mysql по самой новой из 2 дат

У меня есть таблица с двумя датами — ДОБАВЛЕНИЕ и ОБНОВЛЕНИЕ.
Когда элемент добавляется, ДОБАВЛЕНИЕ — это текущая дата, а ОБНОВЛЕНИЕ — 0000-00-00.

Мне нужно ORDER BY выполнить команду SQL и получить наилучшую дату из этих 2.
Например, если ADD=1/12/2010 и UPDATE=30/6/2010, ДАТА ОБНОВЛЕНИЯ будет лучшей (самой новой).

Любой совет?


person ntan    schedule 16.07.2010    source источник


Ответы (3)


Используйте GREATEST, чтобы найти самую новую дату:

ORDER BY GREATEST(UPDATEDATE, ADDDATE)
person Mark Byers    schedule 16.07.2010
comment
Просто совет для людей, у которых возникла проблема, с которой столкнулся я. Если вам нужно сравнить отметку времени и дату MySQL, вы также можете выполнить ORDER BY GREATEST(ADDDATE, FROM_UNIXTIME(UPDATEDATE)) - person Jdahern; 07.02.2015

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

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

Технически это нарушает 3NF, поскольку дублирует одну из дат, но нарушение допустимо по соображениям производительности, и вы по-прежнему поддерживаете свойства ACID, поскольку триггеры требуют, чтобы столбцы оставались согласованными.

Я не знаю синтаксиса триггера MySQL, но я бы сделал что-то вроде:

  • Создайте новый столбец, установив для него подходящее значение по умолчанию.
  • Создайте триггеры вставки/обновления, чтобы обеспечить отражение изменений.
  • Коснитесь всех строк с запросом типа update TBL set ADDDATE = ADDDATE, чтобы триггер срабатывал для всех текущих строк.

Преимущество этого решения заключается в том, что оно переносит стоимость вычислений на время изменения данных, а не каждый раз, когда вы запрашиваете базу данных. Это амортизирует затраты на все чтения, делая их более эффективными (если только вы не один из тех очень редких зверей, у которых таблица записывается чаще, чем читается).

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

person paxdiablo    schedule 16.07.2010

person    schedule
comment
Это работает лучше, чем GREATEST, когда возможны значения NULL, и вы хотите, чтобы возвращалось ненулевое значение. - person MD004; 19.02.2018
comment
ты спас мой день - person スージン; 25.11.2019