2011-09-19 67 views
0

我有一个事务表,它使用我们的电子邮件营销消息中的跟踪像素来注册电子邮件。我试图构建一个查询,该查询将为我提供交易表中的记录,其最后记录的电子邮件的阅读时间超过6周。原因是,那些交易没有“参与”我们的电子邮件营销,我需要更新其订户字段之一来反映(以便他们可以接收不同类型的电子邮件)。帮助构建MySQL SELECT语句

如果我写出来的英文,声明看起来有点像这样:

选择从交易,其中用户ID出现超过6个星期前,但不存在于行最近6周。

因此,最初的想法是创建我的过去6周内打开电子邮件的人的记录集,然后将其与表中的其余部分进行比较?我可以在一个声明中做到这一点,还是应该将它分成两部分?

在此先感谢任何能够帮助您的人。

回答

3
SELECT SubscriberId 
    FROM TransactionTable 
    GROUP BY SubscriberId 
    HAVING MAX(ReadDate) < DATE_SUB(NOW(), INTERVAL 6 WEEK) 
+0

谢谢乔;如果我有更多的条件,我可以在哪里放置它们? (有一个字段实际上将它们排除在这个查询之外,无论它叫做status =“C”) –

+0

WHERE在FROM和GROUP BY之间。 –

+0

太棒了。工作。在正确的时间范围内获得约120条记录。在6周内将它们的样本与记录集进行比较,以确定这是否确实是解决方案。再次感谢! –

0

不需要花哨的数学。您的要求归结为一个简单的<子句:它没有记录,最后6周交易的任何用户:

SELECT userID 
FROM transactionstable 
WHERE MAX(timestampfield) < DATE_SUB(now(), INTERVAL 6 WEEK) 
GROUP BY userID 
+1

但是,这仍可能回报客户谁也有了更多最近的交易。 –

+0

感谢您的快速回复;然而,我看到这将如何在6周之前给我所有记录,但是查询如何知道在6周内是否也找到了其中一位订阅者?因为我不想更新这些人......只是那些在6星期以外但不在里面的人。 –

+0

好点。稍微修改一下查询。大部分与上面的Joe相同,但使用WHERE子句而不是HAVING。 –

0

定义一个字段,它显示了,最后6周的活动。我的意思是整数0或1。然后:

SELECT * FROM transtable WHERE activityfield = 0 AND datefield < DATE_SUB(now(), INTERVAL 6 WEEK)

0

如果您正在使用支持Oracle SQL使用的数据库,那么试试这个:

SELECT * from transactions 
WHERE subscribed_date < SYSDATE-(6*7);