Как удалить записи через определенное время в зависимости от значения определенного поля?

У меня есть таблица с именем users. Два поля в этой таблице — «активация» и «regdate». Оба ВАРЧАР. Поле активация содержит строку «активно», если пользователь активировал учетную запись. Если пользователь не активировал учетную запись, поле содержит строку, которая является рандомизированным буквенно-цифровым ключом активации. Поле regdate содержит дату и время регистрации учетной записи пользователем, заполненные date("m.d.y H:m:s");.

Что мне нужно сделать, так это создать PHP-скрипт, который удалит все записи, которые НЕ равны «активным» в поле активации и старше указанного мной времени. Я знаю, как найти записи по соответствующим критериям, таким как выбор записей, где активация равна «активной», но мне нужно, чтобы это было наоборот. Мне нужно, чтобы он соответствовал всем записям, где активация не равна «активной» (потому что рандомизированную строку было бы невозможно сопоставить, не так ли?).

Конечно, тогда мне также пришлось бы сравнивать выбранные записи с текущим временем на основе поля «regdate» этих записей.

Короче говоря, у меня есть куча записей, и я хочу удалить все те, которые старше определенного периода времени и имеют поле, которое НЕ равно «активно».

Я извиняюсь, если я не объяснил это достаточно хорошо. Я очень устал, и это также мой первый пост на stackoverflow.


person vertigoelectric    schedule 15.09.2011    source источник
comment
Почему поле regdate не хранится как поле datetime в вашей БД? Это значительно упростит запрос.   -  person mal-wan    schedule 15.09.2011
comment
Вы хотите запустить это как задание cron?   -  person 1ftw1    schedule 15.09.2011
comment
О да, я буду запускать это как задание cron. Я забыл упомянуть об этом. Какой рекомендуемый интервал для запуска задания? Как вы думаете, почасовая оплата будет уместной?   -  person vertigoelectric    schedule 15.09.2011


Ответы (2)


Если вы преобразуете поле regdate в тип DATETIME, запрос может быть таким простым, как:

DELETE FROM users WHERE activation <> 'active' AND regdate < '2011-01-01'

В противном случае, в зависимости от формата вашей регдаты VARCHAR, вам придется CAST или CONVERT ввести ее в DATETIME, прежде чем сравнивать ее в предложении WHERE.

Этой информации достаточно для того, чтобы это заработало?

person mal-wan    schedule 15.09.2011
comment
Тот '‹›', который вы показали мне в этом фрагменте кода, был именно тем, что мне было нужно. Я не знал, как проверить неравенство в запросе MySQL. Я полагаю, что изменение поля на тип «DATETIME» было бы наиболее подходящим. Я надеюсь, что он сохранит его как «mm.dd.yyyy», а не с первым годом. В любом случае, я попробую это. Спасибо. - person vertigoelectric; 15.09.2011
comment
@Ronnie: Не беспокойтесь о том, как сама база данных хранит DATETIME, это не имеет значения, потому что, пока она понимает, что это дата, вы можете форматировать ее как хотите с помощью функции DATE_FORMAT() (в MySQL). Большинство механизмов БД по умолчанию отображают и вводят дату как YYYY-MM-DD hh:mm:ss, потому что это общепризнано. - person mal-wan; 16.09.2011

Измените свое поле в базе данных на «datetime» с помощью mysqladmin, это должно быть очень просто (данные будут выглядеть примерно так: «2011-09-13 02:08:20»), тогда вы можете использовать стандартные команды mysql, например:

mysql_query("DELETE   FROM `iplog` WHERE  DATE(datefield)  <= DATE_ADD(CURDATE(), INTERVAL -2 DAY) AND activation <> 'active'");

это удаляет все, что старше 2 дней в моей таблице «iplog» и не активно.

person normeus    schedule 15.09.2011