Как быть уверенным, чтобы не потерять значения при выборе идентификатора последних X дней в SQL - PullRequest
0 голосов
/ 09 апреля 2020

Чтобы дать вам контекст моей проблемы: я хочу получить по электронной почте идентификатор и дату создания материала , созданного за 15 последних дней .

Я хочу позвонить функция каждые 15 дней в PHP. Я делаю это, создавая задачу CRON, которая будет запускаться каждый из 1-го и 16-го числа месяца . Это мой запрос SQL запрос:

SELECT ID,
       creation_date
FROM mytable
WHERE creation_date > DATE_SUB (NOW (), INTERVAL 16 DAY)

Меня беспокоит потеря значений . Какой хороший способ сделать это? Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Самое простое решение:

Добавьте столбец isNotified в вашу таблицу следующим образом:

| ID | creation_date | isNotified |
|----|---------------|------------|
| 1  | 2020-03-26    | 1          |
| 2  | 2020-04-09    | 0          |
| 3  | 2020-04-10    | 0          |

Затем обновите ваш запрос, чтобы выбрать только еще не отправленные элементы:

SELECT ID,creation_date FROM mytable WHERE isNotified=false
// Send your mail

Если отправка в порядке, обновите столбец, установив isNotified как True следующим образом:

UPDATE mytable SET isNotified = true WHERE isNotified = false

Установите вкладку CRON для запуска 1st и 15 месяца.

0 голосов
/ 09 апреля 2020

Если вы хотите убедиться, что вы не потеряете какие-либо данные, у меня есть таблица, для которой ID уже был уведомлен:

NotificationsLog
ID, batchGuid, batchDate

(Дата партии носит исключительно информационный характер, не требуется для этого процесса). В моем php я бы сделал новый Guid, затем запустил вставку:

INSERT INTO Notifications 
SELECT t.ID, @guidFromPhp, NOW()
FROM mytable t
  LEFT JOIN notificationslog n on n.id = t.id
WHERE n.ID is null

Этот выбор получает все новые данные (новые, как в таблице журналов) благодаря левому соединению, ищущему ноль , Все новые данные записываются в том же пакете Guid.

Тогда я бы вытащил строки и отправил их по электронной почте на основе того же Guid:

SELECT t.ID, t.Whatever
FROM mytable t
  INNER JOIN notificationslog n on n.id = t.id
WHERE n.batchGuid = @guidFromPhp

Здесь не нужны даты, и данные не пропадают; процесс отправляет по электронной почте все неотправленные данные при каждом запуске. Если вы запускаете его каждые 15 дней, он делает все за последние 15 дней (кроме первого запуска, который выполняется. Предварительно загрузите журнал со всеми текущими данными, чтобы избежать этого). Если вы запускаете его каждые 30 минут, вы получаете данные за последние 30 минут

Вы можете добавить в таблицу журнала статус, если есть риск, что электронная почта не удастся (или просто удалите эту запись из n - это будет снова взяли в следующий раз)

...