Событие / время и критерии на основе SQL - PullRequest
0 голосов
/ 10 ноября 2011

Полагаю, это скорее вопрос шаблона проектирования, чем вопрос SQL.

В моем приложении пользователь может присоединиться, создать магазин и загрузить товары в своем магазине (скажем, есть пользователь, магазин (один к одному) и товары (многие к одному с магазинами).

Итак, я хочу иметь возможность делать определенные вещи, основываясь на времени и критериях (но только один раз), например, если через неделю после присоединения к пользователю нет магазина, я хочу отправить электронное письмо, или через 2 недели после присоединения с Магазин, но ни один продукт не отправлять по электронной почте и т. д. - но я хочу сделать это только один раз.

Это единственный запущенный один раз, который делает мою голову - например, скажем, у меня был этот запрос

select * from user where joineddt < '1 week ago date'

И у меня был скрипт, который запускался каждые 3 часа, запускал SQL, а затем делал любое событие (например, отправлял электронное письмо). Затем я хотел бы убедиться, что если этот скрипт будет запущен снова, он не подберет пользователей, которые уже были обработаны. Я думал о представлении таблицы «событий», в которой после запуска события для пользователя регистрируется запись для этого события, но опять же, похоже, это не работает. Например, скажем, у меня была таблица событий, был идентификатор, пользователь, событие

select * from user a
left join event b on b.user = a.id
where a.joineddt < '1 week ago date'
and b.event = 'userjoined'
and b.id is null

Так что, когда в событиях нет возможности для события 'userjoined', он не вернет результатов ... Но на самом деле я хочу, чтобы он возвращал пользователей, у которых нет событий в таблице событий для этого 'userjoined' событие?

Так может ли кто-нибудь придумать способ сделать то, что я предлагаю?

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Ваш запрос всегда будет возвращать 0 строк, потому что если b.id равен нулю, b.event никогда не может быть присоединен к пользователю. Переместите критерии userjoined в предложение join.

SELECT a.* 
FROM user a 
LEFT JOIN event b ON (b.user = a.id AND b.event = 'userjoined') 
WHERE a.joineddt < '1 week ago date' 
AND b.id IS NULL
0 голосов
/ 10 ноября 2011

Вам не нужно иметь дополнительную таблицу (соединения стоят дорого) для реализации вашего решения.В вашей пользовательской таблице просто добавьте два столбца даты с нулем: «date_joined» и «Напоминание».Убедитесь, что логика вашего приложения (которую вы можете определить на стороне таблицы / базы данных) по умолчанию выставляет date_joined на дату присоединения и напоминает NULL.

Чтобы подобрать пользователей, которым нужно напоминание:

SELECT * FROM users
WHERE date_joined > '1 week ago' AND reminded IS NULL

Обязательно заполните «Напоминание» с датой после отправки электронного письма.Таким образом, следующий запуск скрипта не поднимет его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...