Mysql заказ предметов по новейшей из 2 дат - PullRequest
12 голосов
/ 16 июля 2010

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

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

Какой совет?

Ответы [ 3 ]

24 голосов
/ 16 июля 2010

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

ORDER BY GREATEST(UPDATEDATE, ADDDATE)
11 голосов
/ 16 июля 2010
 ORDER BY IF(UPDATEDATE > ADDDATE, UPDATEDATE, ADDDATE)
8 голосов
/ 16 июля 2010

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

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

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

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

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

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

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

...