事件/时间和基于标准的SQL

时间:2011-11-10 08:53:43

标签: mysql sql

我想这更像是一个设计模式问题而不是SQL问题。

在我的应用程序中,用户可以加入,可以在他们的商店中创建商店并加载产品(因此,假设有一个用户,商店(一对一)和产品(与商店多对一)。

所以我希望能够根据时间和标准(但只有一次)做某些事情,例如,如果加入用户后一周没有商店我想发送电子邮件,或者加入后2周购物,但没有产品发送电子邮件等 - 但我只想做一次。

它是唯一一次正在进行的运行 - 例如,假设我有这个查询

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

我有一个脚本每3个小时运行一次,触发SQL然后执行任何事件(例如发送电子邮件)然后我想确保如果再次触发此脚本它将不会接收任何已经使用过的用户已被处理。我想过引入一个'events'表,一旦用户的事件被触发,就记录该事件的一个条目,但这似乎不起作用。例如,说我有事件表,有id,用户,事件

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 个答案:

答案 0 :(得分:1)

您的查询将始终返回0行,因为如果b.id为null,则b.event永远不会是'userjoined'。 将“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

答案 1 :(得分:0)

您不需要额外的表(连接很昂贵)来实现您的解决方案。在您的用户表中,只需添加两个可以为空的日期列:'date_joined'和'reminded'。确保您的应用程序逻辑(您可以在表/数据库端定义)将'date_joined'默认为加入日期并'提醒'为NULL。

选择需要提醒的用户:

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

确保在您发送电子邮件后填写“已提醒”日期。这样,下一次运行脚本就不会捡起来。